30/09/2018, 22:05

Laravel: Làm sao xác định owner thuộc table nào trong many to many polymorphic relation?

Mình đang học Many to many Polymorphic relation trong Laravel. Mình làm theo như example. Tag của mình gồm PHP và movie. Mình có 1 post chứa tag PHP. Làm sao để mình xác định tag owner của PHP là post hay video để mình dùng function posts hoặc videos nhằm gọi owner của tag PHP? Vì khi dùng
Route::get('tag/{id}/', function($id){ $tag = Tag::find(1); echo $tag->posts; });
mình phải biết chắc tag thuộc một post nào đó chứ không phải thuộc một video. Nếu không thông tin in ra sẽ chẳng có gì hết. Cám ơn.

Quân viết 00:13 ngày 01/10/2018

Không rõ ý định của bạn là gì, nhưng ta phải phân tích như sau:
Tag có quan hệ many to many với cả video và post, do đó 1 tag có thể tồn tại ở nhiều video và nhiều post, do đó nếu lấy thông tin đi kèm của 1 tag ta sẽ lấy ra được 0-> nhiều video và post, nên việc xác định tag thuộc post hay video là không hợp lí, trừ khi muốn search cu thể thì bạn phải tạo thêm router thôi

Truong Van Hoc viết 00:08 ngày 01/10/2018

Mình hơi nhầm lẫn chỗ hoặc chỉ thuộc post hoặc chỉ thuộc video mà quên vụ có thể thuộc cả 2.
Trở lại với vấn đề, ví dụ: Mình muốn tạo 1 trang về 1 tag cụ thể, ở đây là PHP, trang sẽ hiển thị các post và video có dùng tag PHP. Vì không biết có post nào, video nào chứa tag PHP không nên mình sẽ phải dùng cả $tag->posts và $tag->videos để gọi owner của tag PHP - là các post(nếu có chứa tag PHP) và các video(nếu có chứa tag PHP). Nếu không có video nào dùng tag PHP, vậy thì mình phí công dùng $tag->videos rồi. Nên mình muốn check taggable_type trước khi retrieve owner. Nếu có 1 post có tag PHP thì table taggable sẽ có 1 row với id_tag là id của tag PHP trong table Tag và taggable_type có giá trị “App\Post”. Dựa vào 2 cái này mình biết khi dùng $tag->posts sẽ chắc chắn có ít nhất 1 kết quả. Ngược lại trong table taggable, không có row nào có id_tag là id của tag PHP và taggable_type có giá trị “App\Video”, nên mình sẽ không dùng $tag->videos.
Mình đang học về polymorphic relation nên muốn vọc vọc tìm hiểu thôi. Nhưng nếu vấn đề mình đặt ra không thực tiễn thì bạn cứ nói để mình bỏ qua. Cám ơn
Có khi mình cứ dùng hết $tag->posts và $tag->videos, cái nào có thì hiện thông tin, cái nào không thể để trống.

Quân viết 00:12 ngày 01/10/2018

Thực ra giải pháp có thêm 1 table taggable cũng là 1 cách, Tuy nhiên sẽ khiến cấu trúc dữ liệu của bạn phức tạp hơn 1 chút, hoặc chỉ đơn giản là bạn tìm video theo tag và post theo tag là xong, chỉ khi nào người dùng muốn chỉ rõ muốn tìm loại nào thì sẽ tìm theo loại đó vi dụ
/tag/{id}/{type}
để chỉ tìm theo tag của type, nếu làm thế này thì sau này có thêm type mới như không chỉ mỗi post và video mà sẽ có thêm People, event, sound thì bạn cũng không phải nhọc công làm thêm

Truong Van Hoc viết 00:16 ngày 01/10/2018

/tag/{id}/{type}
Có lẽ mình sẽ áp dụng {type} được. Cám ơn bạn

Bài liên quan
0