Laravel Query Builder по идентификатору отдаленных отношений

у меня 3 модели

Language: id,name.                Table: languages.|
Variant:id,name, language_id.    Table:variants.|
Symbol: id, name, variant_id.     Table :symbols.

Relations:
Language->hasMany->Variant.|
Variant->hasMany->Symbol.|
Language->hasManyThrough->(Symbol,Variant)

Я хотел найти все символы, принадлежащие языку, по language_id и передать объект $symbols Query Builder, разбитый на страницы, в мое представление из контроллера.

Я пробовал что-то вроде

$variants=Variant::with('symbol')->where('language_id',"=",$language_id)->get();
$symbols= collect(new Symbol);
foreach($variants as $variant){
$symbols->push($variant->symbol()->paginate(10));
}

return view(symbols.index,compact($symbols))

в представлении я просто повторяю запрошенные элементы в foreach @foreach($symbols as $item) {{ $item->name; }}

Это выдает ошибку, поскольку переданный объект является коллекцией, а не результатом, возвращаемым запросом.

Как преобразовать эту коллекцию в результат построителя запросов?


person kishoreinme    schedule 08.02.2018    source источник
comment
Просто не вызывайте ->get(), это даст вам экземпляр билдера.   -  person    schedule 08.02.2018
comment
Удаление get() вызывает ошибку в представлении Method appends does not exist. Я просто повторяю там переменную. Есть ли другой способ добиться этого? Новая коллекция и foreach создают объект коллекции, который также не может быть разбит на страницы.   -  person kishoreinme    schedule 08.02.2018
comment
Можете ли вы также опубликовать код в своем представлении?   -  person Nikola Gavric    schedule 08.02.2018
comment
` @foreach($symbols as $item) {{$item-›name}} ` . Я просто повторяю их в представлениях в foreach.   -  person kishoreinme    schedule 08.02.2018
comment
Я думаю, что запрос, который я разместил, должен помочь @user1099253   -  person Nikola Gavric    schedule 08.02.2018


Ответы (1)


Попробуйте что-нибудь вроде этого

$symbols = Symbol::whereHas('variant', function ($query) use ($language_id) {
    $query->where('language_id', $language_id);
})->paginate(10);

return view('index', ['symbols' => $symbols]);
person Nikola Gavric    schedule 08.02.2018
comment
По сути, вы начали противоположным образом с первой попытки, что означает, что вы должны были начать строить свой запрос с объекта, который вы хотели получить, который в этом случае является символом, поэтому естественный способ получения всех символов - это запрос к ним , а не вариант. Функция whereHas извлекает все модели, которые имеют отношения, т. е. не нулевые, если вы передаете функцию в качестве второго параметра в whereHas, вы затем запрашиваете таблицу вариантов, поэтому в основном мы сначала извлекаем все символы, которые имеют вариант, который имеет определенный идентификатор_языка. Надеюсь, это прояснит это - person Nikola Gavric; 08.02.2018