Laravel eagerloading не работает

Я пытаюсь использовать функциональность eagerlaoding Laravels, но она не ведет себя так, как ожидалось.

Я пытался следовать официальным примерам, но не могу воспроизвести их поведение.

у меня есть Product класс который hasMany('OrderLine') Имеются в виду фактические заказы на этот продукт.

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

$products = Product::with('OrderLines')->get();
foreach($products as $product) {
var_dump($product->orderlines->first());
};

Это должно работать нормально, верно?

Хорошо, когда я проверяю журнал SQL, это происходит:

[SQL] select * from "products"bindings: []
time: 0.71 milliseconds
[SQL] select * from "order_lines" where "order_lines"."product_id" in (?, ?, ?, ?)
bindings: [2,3,4,5]
time: 0.79 milliseconds
[SQL] select * from "order_lines" where "order_lines"."product_id" = ?
bindings: [2]
time: 0.32 milliseconds
[SQL] select * from "order_lines" where "order_lines"."product_id" = ?
bindings: [3]
time: 0.3 milliseconds
[SQL] select * from "order_lines" where "order_lines"."product_id" = ?
bindings: [4]
time: 0.31 milliseconds
[SQL] select * from "order_lines" where "order_lines"."product_id" = ?
bindings: [5]
time: 0.29 milliseconds

Кажется, я не могу понять, почему Laravel / Eloquent так себя ведет. Сначала он корректно загружает строки, но затем игнорирует предварительно загруженные строки заказа, когда я зацикливаюсь на продуктах …?

0

Решение

Вы должны зациклить orderlines сюда:

foreach($products as $product) {
foreach ($product->orderlines as $ol) {
echo $ol->name;
}
}

РЕДАКТИРОВАТЬ

Я проверил это, и проблема в случае букв.

Если ваше отношение имеет имя orderLines вы должны использовать:

$products = Product::with('orderLines')->get();

foreach($products as $product) {
foreach ($product->orderLines $ol) {
echo $ol->name;
}
}

так что во всех местах вы должны использовать orderLines точно так же — не в одном месте OrderLines а в другом orderlines

1

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

Других решений пока нет …

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