这就是我想要的,我有两张桌子。一个是'餐馆',另一个是'设施'。
表格简单..和一对一的关系。比如有一个带有id
,name
,slug
等的餐厅桌子以及另一个名为facilities
的表id
,restaurant_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#=修改,但我遇到了类似的问题。
答案 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();