Получение сводных значений с дальними связями в Laravel

В моем проекте Laravel я использовал следующее (вдохновленный отсюда) чтобы получить далекие отношения от модели к другой. Я не могу использовать HasManyThrough метод с брусья а также bazs связаны с полиморфным отношением.

public class MyClass
{
public function foos()
{
return $this->hasMany('App\Foo');
}

public function getBazAttribute()
{
$this->load(['foos.bars.bazs' => function ($q) use (&$bazs) {
$bazs = $q->get()->unique();
}]);
}
}

Это работает как ожидалось и возвращает bazs которые связаны с брусья которые связаны с Foos которые связаны с Объект MyClass. Моя проблема в том, что я не знаю, как я могу использовать это, чтобы легко получить такие вещи, как:

  • Конкретные Foos что каждый Baz имеет отношение к
  • Общее количество Foos что каждый Baz имеет отношение к

Примечание: список Foos вернулся должен быть Foos что bazs связаны с бар через

4

Решение

Я отвечу на оба вопроса одним способом.

Самым простым способом, вероятно, будет загрузка foos с энергичной нагрузкой — но в противоположном направлении — на $bazs коллекция:

$bazs->load('bars.foos');

И определите, например, метод Accessor в модели baz:

public function getFoosAttribute()
{
$foos = \Illuminate\Database\Eloquent\Collection::make([]);
foreach ($this->bars as $bar) {
$foos->merge($bar->foos);
}
return $foos;
}

Теперь, когда вы загрузите их все, вы можете повторить их и использовать некоторые результаты коллекций foos:

foreach ($bazs as $baz) {
// get all baz's foos way
$foosOfBaz = $baz->foos;

//when we have them all in collection we can easily count them
$foosOfBaz->count()
}

Список возвращаемых foos должен быть теми, которые связаны между собой
в бар через

Если вы хотите получить foos, связанные с базой, через определенную панель, доступ к которой можно получить только через вложенный цикл for / foreach, поскольку оба уровня отношения (баз и его столбцы) находятся в коллекции:

$bazs->load('bars.foos');

foreach ($bazs as $baz) {
foreach ($baz->bars as $bar) {
//here You can access the foos collection
//that is from bar's that belongs to baz model's object
$bar->foos;
}
}

Примечание: если игрушка хочет получить массив, вы должны сделать это с помощью: $bar->foos->toArray() или использовать ->pluck('filed_name', 'key_name')->toArray() метод для простого списка

0

Другие решения

Вы можете решить такие длительные отношения, используя Foreign Keys. Я испытал это много раз в огромных проектах. Позвольте мне объяснить ниже:

Один из способов решения проблемы был бы.

Таблица A Таблица B Таблица C Таблица D
1 х х я
2 б у II
3 c z III

Пусть здесь сказано, что у вас есть таблица A, связанная с таблицей B, а таблица B с таблицей C и таблица C с таблицей D.

Если вы хотите получить данные, которые требуют только таблицы A и D и не имеют ничего общего с промежуточной таблицей. Вы можете создать отношение внешнего ключа в D, которое напрямую соединяется с таблицей A.

Ниже приведен пример из одного моего проекта, который имел длительные отношения.

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

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

0

По вопросам рекламы [email protected]