Laravel 4 - 如何使用关系列的条件

时间:2013-09-19 01:58:17

标签: laravel laravel-4 where

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

表格简单..和一对一的关系。比如有一个带有idnameslug等的餐厅桌子以及另一个名为facilities的表idrestaurant_id,{{ 1}},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'); } }

如何使用Eloquent来做到这一点?

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

2 个答案:

答案 0 :(得分:12)

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

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

class Restaurant extends Eloquent {

    protected $table = 'restaurants';

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

或者您可以尝试使用query scopes

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

答案 1 :(得分:1)

有两种方法可以过滤这两种方法,这是使用QueryBuilder:

Restaurant::join('facilities','facilities.restaurant_id','=','restaurants.id')
                ->where('name','bbq')
                ->where('facilities.wifi','!=', 1)
                ->get();