2015-05-18 5 views
0

У меня есть отчет класса, который имеет отношение toMany к метрике. Отчет также дополнительно имеет отношение к отношению к метрике.Laravel/Eloquent - изготовленный на заказ метод отношения

Как правило, модель, возвращаемая отношением belongsTo, является такой же, как и одна из моделей в отношении toTotMany. Когда это правда, мне бы хотелось, чтобы каждый из этих двух отношений действительно смотрел на один и тот же экземпляр объекта (это также экономит дополнительную поездку на db).

Итак, в базовых терминах - есть ли способ получить одно отношение для проверки другого, чтобы увидеть, была ли модель уже загружена, и если да, укажите на этот объект, а не на создание нового.

Я попытался поместить некоторый код в метод applyTo для Metric, но я не могу обойти тот факт, что ему нужно вернуть экземпляр attributeTo, которому нужны различные вещи, переданные как аргументы конструктора (т. Е. Объект запроса) которые не актуальны в этом случае, когда модель уже была загружена в соответствии с отношением toMany.

Я думал о том, чтобы отбросить атрибут belongsTo и добавить данные по горизонтали в сводной таблице для отношения belongsToMany, но это не отношение «многие-ко-многим», которое требуется, так что кажется немного неправильным.

Спасибо!

Geoff

+1

Я бы снова подумал о том, чтобы отбросить отношения 'ownTo'. Преимущество 'ownToMany' заключается в том, что он является гибким и позволяет связать отношения 0, 1 или многих записей. Недостатком является то, что вам нужна дополнительная таблица (сводная таблица) для ее управления. В любом случае вам нужна эта сводная таблица, поэтому просто придерживайтесь 'ownToMany' и сохраняйте путаницу. Если вы настроены на оба, я думаю, что я понял, как делать то, что вы хотите сделать. – user3158900

+0

Возможно, вы правы, но меня отталкивает то, что контекст отношений, принадлежащих отношению, таков, что их должно быть только когда-либо. Используя подход сводной таблицы с булевым столбцом, чтобы отметить одно из атрибутов attribToMany как особенное, кажется инстинктивно неправильным, потому что нечего останавливать несколько записей, отмеченных как специальные. Только чувствует себя немного не так, хотя, возможно, будет так, как я полагаю, единственный способ сделать это «мой путь» - это много дополнений к Eloquent и, видя, что я не ожидаю, что это нужно в другом месте приложения, это, вероятно, не стоит добавленная сложность. –

+0

Если должно быть только 1, это больше похоже на 'ownTo'. Я отправлю быстрый ответ, который, я думаю, должен работать. – user3158900

ответ

1

Идея заключается в том, чтобы написать функцию, которая будет проверять, если загружено отношения и вернуть эти отношения, в противном случае он будет возвращать belongsToMany. Это пойдет в вашем классе Report. Это также для Laravel 5. Если у вас есть 4, просто удалите пространства имен из имен моделей.

public function metric() 
{ 
    return $this->belongsTo('App\Metric'); 
} 

public function metrics() 
{ 
    return $this->belongsToMany('App\Metric'); 
} 

public function getMetric() 
{ 
    if(array_key_exists('metric', $this->getRelations())) { 
     return $this->metric; 
    } 

    return $this->metrics()->first(); 
} 

Если вы решили просто пойти с только belongsToMany, я предлагаю положить уникальный ключ на сводной таблице для обоих идентификаторов, чтобы не получать никаких дубликатов в сводной таблице.

+0

Это близко к тому, что я использовал, но мне пришлось использовать имя метода getMetricAttribute. –

Смежные вопросы