Я пытаюсь использовать функциональность 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 так себя ведет. Сначала он корректно загружает строки, но затем игнорирует предварительно загруженные строки заказа, когда я зацикливаюсь на продуктах …?
Вы должны зациклить 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
Других решений пока нет …