2015-02-09 2 views
1

Я использую Laravel 5 и имею много полиморфных отношений, подобных этому, с моей системой тегов.Поиск всех строк с одним и тем же тегом от многих до многих полиморфных

posts 
    id - integer 
    name - string 

videos 
    id - integer 
    name - string 
    url - string 


tags 
    id - integer 
    name - string 

taggables 
    tag_id - integer 
    taggable_id - integer 
    taggable_type - string 

Теперь, я создаю страницу поиска для поиска всех сообщений и видео с тем же тегом? Я думал об объединении в MySQL, но таблицы столбцов и столбцов столбцов не равны. Есть ли предложение?

ответ

0

Вот красноречивый стиль для достижения этой цели. Предположим, я нахожу все сообщения и видео с тегом id = 1;

$tag = Tag::with(['posts', 'videos'])->find(1); 
    $relations = $tag->getRelations(); 


$posts = $relations['posts']; // Collection of Post models 
$videos = $relations['videos']; // Collection of Video models 

$allRelations = array_merge($posts->toArray(), $videos->toArray()); 
1

Использовать силу Красноречивого. (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(); 
+0

Спасибо вам за ответ, но в моих вопросах я сказал, что создал множество полиморфных отношений, и я не хочу изменять эту структуру. Я ответил на этот вопрос сам. – thangngoc89

Смежные вопросы