Php pivot表上的雄辩或查询
我有这两种型号Php pivot表上的雄辩或查询,php,mysql,laravel,laravel-4,eloquent,Php,Mysql,Laravel,Laravel 4,Eloquent,我有这两种型号 Track id name artist_id Artist id name class Song extends \Eloquent{ public function artist(){ return $this->hasOne('Artist','id', 'artist_id'); } } class Artist extends \Eloquent{ public function songs(
Track
id
name
artist_id
Artist
id
name
class Song extends \Eloquent{
public function artist(){
return $this->hasOne('Artist','id', 'artist_id');
}
}
class Artist extends \Eloquent{
public function songs(){
return $this->hasMany('Song', 'artist_id', 'id');
}
}
现在我想实现一个搜索,搜索词是“happy pharrel”。
我很清楚,我必须搜索歌曲名为“happy”或艺术家名为“happy”的歌曲和歌曲名为“pharrel”或艺术家名为“pharrel”的歌曲
现在,我想知道如何使用对song表和Artister表的条件进行这样的查询?您的代码显示您已经指定了表/类之间的关系——这很好,但我认为在搜索的情况下它不一定有帮助。这是一种保持语法整洁的好方法,也可以用于,但最好为需要搜索不同表上不同列的搜索词编写一个新的查询 我是这样想的,在用户提交搜索时调用的控制器方法中:
$keywords = explode(' ', Input::get('search'));
$results = Song::join('artists', 'songs.artist_id', '=', 'artists.id')
->whereIn('artists.name', $keywords)
->orWhereIn('songs.name', $keywords)
->get();
这相当简单,但应该足以让您开始。正如tbuteler回答的那样,这是将结果发送到数据库查询的最快方法
foreach($keywords as $p){
$songs->where(function($query) use($p){
$query->where('artists.name',"like", "%".$p."%")
->orWhere('songs.name', "like", "%".$p."%");
});
}
如果不执行where(函数($query){…},则有一个查询包含多个or,但每个“or”部分之间的连接缺失
也许这有助于以后的其他人您需要在表之间创建联接以执行搜索查询。是的,通过快速加载和保持代码整洁的简单方法,这非常好。我只是认为这也可以用于搜索不同的属性。您发布的解决方案不能正常工作,如果有人也这样做,我将在另一个答案中发布它遇到:)