我有两个表,tracks
和echonestrecords
。曲目在echonestrecords
表中有一条记录,其中包含有关曲目的信息。
tracks
包含以下列:
id
,title
,artist
,created_at
,updated_at
echonestrecords
包含以下列:
id
,track_id
,tempo
,mode
,key
track
对象具有hasOne()
- 函数以返回echonestrecord
。
echonestrecord
对象具有belongsTo()
- 函数以返回曲目。
我想制作一个Eloquent查询来获取echonestrecords
- 表中所有空行的曲目。也就是说,tempo
的行是空的。
我可以使用原始查询这样做,它不会返回Track对象。
$tracks = DB::table('tracks')
->select('tracks.*')
->join('echonestrecords','echonestrecords.track_id','=','tracks.id')
->where('echonestrecords.tempo',null,'NULL')
->get();
但我无法弄清楚如何用Eloquent做到这一点。我认为它必须是这样的:
$tracks = (array('echonestrecord' => function($query) {
$query->where('tempo', null, 'NULL');
}))->get();
但是这会返回所有曲目!我很困惑。
你能帮助我吗?
答案 0 :(得分:1)
我解决了。 Yahooo ..
答案是使用whereHas:
$tracks = Track::whereHas('EchoNestRecord', function($q)
{
$q->whereNull('tempo');
})->paginate(3);
答案 1 :(得分:0)
你可能需要的是创建一个关系并稍微过滤它:
class EchoNestRecord extends Eloquent {
protected $table = 'echonestrecords';
}
class Track extends Eloquent {
protected $table = 'tracks';
public function RecordsWithNoTempo()
{
return $this->hasOne('EchoNestRecord')->whereNull('tempo');
}
}
然后你应该能够:
$track = Track::find(1);
foreach($track->recordsWithNoTempo as $record)
{
echo $record->name;
}
使用
dd(DB::getQueryLog());
检查生成的查询。