Yêu cầu thg 10 28, 2018 5:12 CH 3441 0 4
  • 3441 0 4
0

join query builder trong laravel

Chia sẻ
  • 3441 0 4

em tìm google không ra nghĩ mãi nhưng chưa giải quyết được mong anh chị giúp em với, join bình thường thì em làm được mà giờ có thêm bảng trung gian là product_tag nên em làm không ra. em có 3 bảng:

products: id

tags: id

product_tag: product_id, tag_id

anh chị giúp em join bảng này với ạ, em muốn khi hiển thị ra sản phẩm thì em lấy được tag thuộc sản phẩm đó.

trong product_tag của em có data:

product_id: 1; tag_id:[tag1, tag2, tag3]

em cảm ơn!

4 CÂU TRẢ LỜI


Đã trả lời thg 10 29, 2018 12:48 SA
Đã được chấp nhận
+4

Bạn tạo model Product, Tag, trong đó có Product quan hệ 1-n với model Tag.

class Product extends Model
{
    /**
     * The roles that belong to the user.
     */
    public function tags()
    {
        return $this->belongsToMany('App\Tags');
    }
}

Khi query Product thì dùng thêm Eager Loading để lấy kèm theo các Tag của nó nữa

$products = App\Product::with('tags')->get();

Bạn có thể tham khảo ở đây để rõ hơn nhé https://laravel.com/docs/5.7/eloquent-relationships#constraining-eager-loads

Chia sẻ
thg 10 29, 2018 3:15 SA

thanks you

Đã trả lời thg 10 29, 2018 12:35 SA
+3

Bạn tìm hiểu khái niệm pivot table chưa bạn?

Chia sẻ
Đã trả lời thg 10 29, 2018 1:07 SA
+3

Ở đây bạn theo mình hiểu ý bạn như sau. Một Product sẽ có nhiều tags, 1 tag cũng sẽ thuộc về nhiều product, vậy nên bạn cần viết một relation để query được dữ liệu. Theo mình bạn nên sử dụng pivot table sử dụng relation belongsToMany. Ví dụ trong model Tag bạn thêm relation:

public function products()
{
    return $this->belongsToMany(Product::class, product_tag, product_id, tag_id);
}

Sau đó bạn sử dụng như truy vấn như bình thường. Bạn có thể tham khảo link này để rõ hơn về pivot table. https://viblo.asia/p/pivot-tables-and-many-to-many-relationships-trong-laravel-DzVkpLjOknW

Chia sẻ
thg 10 29, 2018 3:20 SA

thanks you

Avatar Vũ Nguyễn @vunguyen10111995
thg 10 29, 2018 5:15 SA

Nếu bạn thấy câu trả lời nào hợp lý , bạn có thể accept nó nhé. 😋

Đã trả lời thg 10 29, 2018 1:30 SA
+1

trong product_tag của em có data:
product_id: 1; tag_id:[tag1, tag2, tag3]

Vấn đề của em đang nằm ở phần thiết kế cơ sở dữ liệu này 😄

Cách thức lưu ở bảng trung gian như của em như ở trên là không hợp lý, lưu như vậy em rất khó để dùng lệnh join khi select tags cho một product. Ngoài ra khi select products cho một tag thì sẽ còn khó khăn hơn.

Em nên lưu dữ liệu như sau:

Bảng products

id name
1 S9
2 S9+
3 Iphone X

Bảng tags

id name
1 Android
2 iOS
3 Samsung

Bảng product_tag

id product_id tag_id
1 1 1
2 1 3
3 3 2

Như vậy em có thể dùng tính năng Many to Many Relationship của Laravel để có thể dễ dàng load ra tags từ $product bằng câu lệnh $product->tags hoặc ngược lại. Em có thể tham khảo các câu trả lời khác trong bài này để có thêm thông tin chi tiết hơn nhé 😉

Chia sẻ
thg 10 29, 2018 3:09 SA

e lưu giống bên trên của a ạ, e xong phần admin rồi nên giờ e muốn hiển thị ra frontend, e làm theo kiểu này đầu tiên e

$productNew = Product::select(....)->get();

rồi e sử dụng foreach để lặp

foreach($productNew  as $data)

// em hiển thị tag
foreach($data->tags as $tag)

<p>{!! $tag->name !!}</p>

@endforeach

endforeach

như này vẫn ra nhưng nhiều query quá ạ, thành ra e có 3 sản phẩm thì nó lên tận 4 câu query, bình thường join e hay sử dụng query builer thay vì dùng with('tags')with('tags') nó ra 2 câu query còn query builer nó hiển thị có 1 câu query, như ảnh bên dưới của e, e join với bảng category nó hiện ra có 1 câu query

1.jpg

Avatar Tran Duc Thang @thangtd90
thg 10 29, 2018 3:41 SA

@xuanhung Dùng Many to Many Relationship của Laravel thì em cũng dùng được eager loading😄

thg 10 29, 2018 4:24 SA

@thangtd90 em làm đc rồi ạ cảm ơn a, mà cho e hỏi e load cả thằng categorys thì bên view e hiển thị kiểu gì để lấy được tên của category đấy ạ, e dùng with thì lấy ra được nhưng sử dụng phương thức đấy cho load thì lại k lấy đc. 2.jpg

Avatar Tran Duc Thang @thangtd90
thg 10 29, 2018 5:51 SA

@xuanhung Em dùng load như thế nào mà không được nhỉ 🤔

Ví dụ như khi đã có $products rồi, thì em có thể gọi $products->load('category') để eager loading tất cả các category của các products ra mà 😃

thg 10 29, 2018 6:41 SA

@thangtd90 $product->load('categorys', 'tags')

bên view $product as $item

$item->categorys['name'] $item['categorys']['name'] đều k ra ạ

thg 10 29, 2018 6:58 SA

à được rồi ạ, cảm ơn a

Avatar Tran Duc Thang @thangtd90
thg 10 29, 2018 7:29 SA
Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí