Использовать силу Красноречивого. (Post.php
, Video.php
, Tag.php
).
Post.php
class Post extends Eloquent {
public function tags()
{
return $this->belongsToMany('Tag');
}
}
Video.php
class Video extends Eloquent {
public function tags()
{
return $this->belongsToMany('Tag');
}
}
Tag.php
class Post extends Eloquent {
public function posts()
{
return $this->belongsToMany('Post');
}
public function videos()
{
return $this->belongsToMany('Video');
}
}
Более подробно об этом вы можете прочитать в Laravel Eloquent Relationships документации.
Далее, вместо того, чтобы taggeables
создать две сводные таблицы: сначала post_tag
с полями tag_id
и post_id
для подключения сообщения с тегами, а второй tag_video
с полями video_id
и tag_id
для подключения видео с тегами.
И, наконец, получить все сообщения и видео с тем же тегом идентификатором (скажем $ tag_id) вы можете сделать что-то вроде этого (если Post.php
модели действительно содержит tags()
метода):
Для сообщений:
$posts = Post::whereHas(`tags`, function($q) {
$q->where('id', '=', $this->id);
})->orderBy('name', 'ASC')->get();
для видео:
$videos = Video::whereHas(`tags`, function($q) {
$q->where('id', '=', $this->id);
})->orderBy('name', 'ASC')->get();
Спасибо вам за ответ, но в моих вопросах я сказал, что создал множество полиморфных отношений, и я не хочу изменять эту структуру. Я ответил на этот вопрос сам. – thangngoc89