Laravel雄辩查询(一对一)

时间:2014-05-10 14:50:14

标签: laravel laravel-4

我有两个表,tracksechonestrecords。曲目在echonestrecords表中有一条记录,其中包含有关曲目的信息。

tracks包含以下列: idtitleartistcreated_atupdated_at

echonestrecords包含以下列: idtrack_idtempomodekey

track对象具有hasOne() - 函数以返回echonestrecordechonestrecord对象具有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();

但是这会返回所有曲目!我很困惑。

你能帮助我吗?

2 个答案:

答案 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());

检查生成的查询。