Asked Jul 17th, 4:13 PM 83 0 3
  • 83 0 3
+1

Hỏi về eager loading trong laravel

Share
  • 83 0 3

Bình thường em có 2 bảng article vs category ( n - 1) thì khi đọc ra 1 article em có thể with('category'). nhưng bây giờ em có article - category ( n - n) 2 cái đều belongsTomany -> laravel tự sinh ra bảng chung gian article_category Bây giờ em muốn đọc ra một category kèm theo các article theo eager loading như thế nào? Em cảm ơn

Avatar PHAM HIEU @pviethieu
Jul 18th, 1:59 AM

3 ANSWERS


Answered Jul 22nd, 5:26 AM
Accepted
0

Bạn vẫn có thể dùng withload bình thường mà. Bạn thử kiểm tra xem:

  • Có thể bạn khai báo relation sai chăng, nếu sai thì sẽ có lỗi bắn ra, bạn up thêm tracelog lên đấy để mọi người dễ giúp.
  • Dùng with/load sai chăng, with thì sẽ tồn tại trong Query Builder, còn load thì ở Collection/Model - là kết quả của Query Builder sau khi thực thi truy vấn.
Share
Answered Jul 17th, 4:16 PM
+1

vẫn dùng with hoặc load bình thường mà

Share
Answered Jul 18th, 1:59 AM
0

Phương thức with này bạn nên hiểu rằng tham số bên trong with là mảng các quan hệ chứ không phải là một bảng . Vì vậy chúng ta cũng có thể dùng with với quan hệ n - n bình thường trong Laravel. https://laravel.com/api/8.x/Illuminate/Database/Eloquent/Builder.html#method_with

image.png

Share
Avatar Nguyen Nhat @nhatnguyen123321
Jul 19th, 12:19 PM

em dùng mà có đc đâu. vd bảng locations vs orders ( n - n ) bảng pivot là: location_order(có id, location_id, order_id) lấy $order = Order::find(1)->with('locations') mà ko đc.

0
| Reply
Share
Avatar PHAM HIEU @pviethieu
Jul 19th, 2:41 PM

@nhatnguyen123321 ở trong model của 2 bảng này b đã khai báo belongsToMany cho mỗi quan hệ chưa ?

0
| Reply
Share
Avatar Nguyen Nhat @nhatnguyen123321
Jul 20th, 3:36 AM

@pviethieu em đã khai báo đầy đủ

0
| Reply
Share
Avatar PHAM HIEU @pviethieu
Jul 20th, 4:10 AM

@nhatnguyen123321 à sau find nó sẽ trả ra collection cho nen b dùng load() ở sau find() nhé. còn khi dùng with() b có thể đặt trước find()

0
| Reply
Share
Viblo
Let's register a Viblo Account to get more interesting posts.