Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 17.11.2016 07:41:57

Построить отношения

Всем привет. Можно ли переделать такую структуру таблиц под полиморфные связи? Что бы когда берешь у опции свойства не нужно было делать where в запросе.
Option::find(1)->properties()->where('property_type', '=', 'extend')->get();
(связь с where и скоупы в модели не предлагать, уже сделано, интересует именно morph связи)

http://savepic.net/8534958.png

Не в сети

#2 17.11.2016 09:25:16

Re: Построить отношения

прямо - потенциально да (надо создать такую структуру и дёрнуть её, то есть проверить)
не прямо = через переменные
$Option = Option::find(1)
$Properties = $Option->extendedProperies()
внутри метода, возвращающего  связь и надо сделать доборку ->where()->get() и возвращать коллекцию, как обычно.
сразу оговорюсь, что вызов уже будет не
$Properties = $Option->extendedProperies но $Properties = $Option->extendedProperies()

Не в сети

#3 17.11.2016 09:26:30

Re: Построить отношения

и не забывайте, что переменные жрут память
статичным вызовом так же жрёт память, да, но пиковые значения - меньше.

Не в сети

#4 17.11.2016 09:27:41

Re: Построить отношения

hzone пишет:

прямо - потенциально да (надо создать такую структуру и дёрнуть её, то есть проверить)
не прямо = через переменные
$Option = Option::find(1)
$Properties = $Option->extendedProperies()
внутри метода, возвращающего  связь и надо сделать доборку ->where()->get() и возвращать коллекцию, как обычно.
сразу оговорюсь, что вызов уже будет не
$Properties = $Option->extendedProperies но $Properties = $Option->extendedProperies()

Подумал бредовая идея была, переделать. Не тот случай. Оставлю как есть

Не в сети

#5 17.11.2016 09:41:14

Re: Построить отношения

почему же бредовая? вполне живая модель поведения.
как раз вписывается в идеологию использования того, что уже есть, вменсто клонирования алгоритма в соседний метод и генерации тонны переменных, кои сделают то же самое, но при этом пожрут память.

Не в сети

#6 17.11.2016 12:12:06

Re: Построить отношения

hzone пишет:

почему же бредовая? вполне живая модель поведения.
как раз вписывается в идеологию использования того, что уже есть, вменсто клонирования алгоритма в соседний метод и генерации тонны переменных, кои сделают то же самое, но при этом пожрут память.

Как вообще лучше поступать в таких ситуациях?
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)

Не в сети

#7 17.11.2016 13:30:03

Re: Построить отношения

Сначала покажи что есть, и что требуется (сухо без эмоций объясни).

Не в сети

#8 17.11.2016 14:02:02

Re: Построить отношения

hzone пишет:

Сначала покажи что есть, и что требуется (сухо без эмоций объясни).

таблица 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

Не в сети

#9 17.11.2016 15:49:23

Re: Построить отношения

мужик!
пожалей глаза читателей!
оберни в bbcode [code ] !

Не в сети

#10 17.11.2016 15:51:04

Re: Построить отношения

hzone пишет:

мужик!
пожалей глаза читателей!
оберни в bbcode [code ] !

уже нет доступа. Да и предложения по нормальному редактору уже давно обсуждалось, так и нету

Не в сети

#11 17.11.2016 16:01:19

Re: Построить отношения

Давай с чистого листа
Опция содержит свойства. Одно ко многому. Полиморфизм тебе не нужен, так как ты не склеиваешь 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 не есть Одна Единая Модель и надо склеить разные модели, то сообщи

Не в сети

Подвал раздела