Asked Oct 28th, 2018 5:12 PM 442 0 4
  • 442 0 4
0

join query builder trong laravel

Share
  • 442 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 ANSWERS


Answered Oct 29th, 2018 12:48 AM
Accepted
+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

Share
Oct 29th, 2018 3:15 AM

thanks you

0
| Reply
Share
Answered Oct 29th, 2018 12:35 AM
+3

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

Share
Answered Oct 29th, 2018 1:07 AM
+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

Share
Oct 29th, 2018 3:20 AM

thanks you

+1
| Reply
Share
Vũ Nguyễn @vunguyen10111995
Oct 29th, 2018 5:15 AM

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

0
| Reply
Share
Answered Oct 29th, 2018 1:30 AM
+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é 😉

Share
Oct 29th, 2018 3:09 AM

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

0
| Reply
Share
Thang Tran Duc @thangtd90
Oct 29th, 2018 3:41 AM

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

0
| Reply
Share
Oct 29th, 2018 4:24 AM

@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

0
| Reply
Share
Thang Tran Duc @thangtd90
Oct 29th, 2018 5:51 AM

@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à 😃

0
| Reply
Share
Oct 29th, 2018 6:41 AM

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

bên view $product as $item

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

0
| Reply
Share
Oct 29th, 2018 6:58 AM

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

0
| Reply
Share
Thang Tran Duc @thangtd90
Oct 29th, 2018 7:29 AM
0
| Reply
Share