Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Всем привет. Можно ли переделать такую структуру таблиц под полиморфные связи? Что бы когда берешь у опции свойства не нужно было делать where в запросе.
Option::find(1)->properties()->where('property_type', '=', 'extend')->get();
(связь с where и скоупы в модели не предлагать, уже сделано, интересует именно morph связи)
Не в сети
прямо - потенциально да (надо создать такую структуру и дёрнуть её, то есть проверить)
не прямо = через переменные
$Option = Option::find(1)
$Properties = $Option->extendedProperies()
внутри метода, возвращающего связь и надо сделать доборку ->where()->get() и возвращать коллекцию, как обычно.
сразу оговорюсь, что вызов уже будет не
$Properties = $Option->extendedProperies но $Properties = $Option->extendedProperies()
Не в сети
и не забывайте, что переменные жрут память
статичным вызовом так же жрёт память, да, но пиковые значения - меньше.
Не в сети
прямо - потенциально да (надо создать такую структуру и дёрнуть её, то есть проверить)
не прямо = через переменные
$Option = Option::find(1)
$Properties = $Option->extendedProperies()
внутри метода, возвращающего связь и надо сделать доборку ->where()->get() и возвращать коллекцию, как обычно.
сразу оговорюсь, что вызов уже будет не
$Properties = $Option->extendedProperies но $Properties = $Option->extendedProperies()
Подумал бредовая идея была, переделать. Не тот случай. Оставлю как есть
Не в сети
почему же бредовая? вполне живая модель поведения.
как раз вписывается в идеологию использования того, что уже есть, вменсто клонирования алгоритма в соседний метод и генерации тонны переменных, кои сделают то же самое, но при этом пожрут память.
Не в сети
почему же бредовая? вполне живая модель поведения.
как раз вписывается в идеологию использования того, что уже есть, вменсто клонирования алгоритма в соседний метод и генерации тонны переменных, кои сделают то же самое, но при этом пожрут память.
Как вообще лучше поступать в таких ситуациях?
1) создать еще одно поле которое ведет на вторую таблицу (если добавится еще одна таблица нужно будет еще одно поле)
2) текущее решение (возникла проблема: хочу вытянуть все properties
OptionProperty::with(['property', 'property_extend'])->get();
Но проблема: если property_id есть и в properties и в property_extends то вытягивается с двух таблиц, а нужно что бы было что-то одно. Передать where в function в with не могу, так как она применяется к вытягиваемой таблице. Как быть? Сейчас сделано в 2 запроса, а потом merge коллекций)
Изменено andrei24 (17.11.2016 12:15:06)
Не в сети
Сначала покажи что есть, и что требуется (сухо без эмоций объясни).
Не в сети
Сначала покажи что есть, и что требуется (сухо без эмоций объясни).
таблица option_properties (id, property_id, property_type)
class OptionProperty extend Model{
function properties() {
return $this->belongsTo(Property::class, 'property_id');
}
function extendProperties()
{
return $this->belongsTo(ExtendProperty::class, 'property_id');
}
}
данные в option_properties:
id|property_id|property_type ( 1 - properties, 2 - extend_properties )
1 | 1 | 1
данные в properties
id|value
1 | 1
данные в extend_properties
id|value
1 | 1
Делаю запрос:
OptionProperty::with(['properties', 'extendProperties'])->get();
Приходит модель с 2мя отношениями, но extendProperties не должно приходить, так как property_type = 1
Не в сети
мужик!
пожалей глаза читателей!
оберни в bbcode [code ] !
Не в сети
мужик!
пожалей глаза читателей!
оберни в bbcode [code ] !
уже нет доступа. Да и предложения по нормальному редактору уже давно обсуждалось, так и нету
Не в сети
Давай с чистого листа
Опция содержит свойства. Одно ко многому. Полиморфизм тебе не нужен, так как ты не склеиваешь 100500 разных моделей. У тебя 2 модели - опции и свойства.
поля id, title
class Options extends Model
{
protected $table = 'options';
protected $fillable = [
'title',
];
public function properties()
{
return $this->hasMany( Properties::class );
}
public function anotherProperties()
{
return $this->hasMany( Properties::class )->where('extra','=','value');
}
}
Свойства принадлежат Опции
поля id, option_id, extra, title
class Properties extends Model
{
protected $table = 'properties';
protected $fillable = [
'extra',
'title',
];
public function option()
{
return $this->belongsTo( Option::class );
}
}
В результате
$Option = Option::find(1);
$PropertiesFromOption = $Option->properties();
$ExtraPropertiesFromOption = $Option->extraProperties();
//....
$DirectProperties = Option::find(1)->properties();
$DirectExtraProperties = Option::find(1)->extraProperties();
Если у тебя Option не есть Одна Единая Модель и надо склеить разные модели, то сообщи
Не в сети
Страницы 1