6

这就是我想要的,我有两张桌子。一个是“餐厅”,另一个是“设施”。

这些表很简单......和一对一的关系。就像有一张带有id, name, slug, 等的餐桌和另一张facilities带有id, restaurant_id, wifi,parking等的餐桌

这是我的模型:

class Restaurant extends Eloquent {

protected $table = 'restaurants';

public function facilities() {
    return $this->hasOne('Facilities'); 
}
}

class Facilities extends Eloquent {

protected $table = 'facilities';

public function restaurant() {
    return $this->belongsTo('Restaurant');
 }


}

我想做这样的Select * from restaurants r left join facilities rf on r.id=rf.restaurant_id where r.name = 'bbq' and rf.wifi != '1'

如何使用 Eloquent 做到这一点?

附言。很抱歉从https://stackoverflow.com/questions/14621943/laravel-how-to-use-where-conditions-for-relations-column# =修改,但我有类似的问题。

4

2 回答 2

12

您可以where在关系对象上使用和其他基于 sql 的方法。

这意味着您可以在模型中创建自定义方法:

class Restaurant extends Eloquent {

    protected $table = 'restaurants';

    public function facilities($wifi) {
        return $this->belongsTo('Facility')->where('wifi', '=', $wifi);
    }
}

或者您可以尝试使用查询范围

class Restaurant extends Eloquent {

    protected $table = 'restaurants';

    public function facility() {
        return $this->belongsTo('Restaurant');
    }

    public function scopeFiltered($query, $wifi)
    {
        return $query->where('wifi', '>', 100);
    }
}

然后:

$wifi = 1;
$restaurants = Restaurant::facilities()->filtered($wifi)->get();

这可能不是您所需要的,但查询范围可能是您想要用来获取您正在尝试的内容。

关键是要知道关系类可以像查询构建器一样使用——例如:

$this->belongsTo('Facility')->where('wifi', '=', $wifi)->orderBy('whatever', 'asc')->get();
于 2013-09-19T12:43:17.640 回答
1

有一些方法可以过滤两者,这是使用 QueryBuilder:

Restaurant::join('facilities','facilities.restaurant_id','=','restaurants.id')
                ->where('name','bbq')
                ->where('facilities.wifi','!=', 1)
                ->get();
于 2013-09-19T04:04:56.527 回答