join query builder trong laravel
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
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
thanks you
Ở đâ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
thanks you
Nếu bạn thấy câu trả lời nào hợp lý , bạn có thể accept nó nhé. 😋
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é
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')
vì 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
@xuanhung Dùng Many to Many Relationship của Laravel thì em cũng dùng được eager loading mà
@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.
@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à
@thangtd90 $product->load('categorys', 'tags')
bên view $product as $item
$item->categorys['name']
$item['categorys']['name']
đều k ra ạ
à được rồi ạ, cảm ơn a