【问题标题】:Laravel 4 - How to use where conditions for relation's columnLaravel 4 - 如何使用关系列的条件
【发布时间】:2013-09-23 23:22:36
【问题描述】:

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

表格很简单.. 和一对一的关系。就像有一张带有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 来做到这一点?

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

【问题讨论】:

标签: laravel laravel-4 where


【解决方案1】:

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

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

【讨论】:

  • 谢谢,我也知道这个方法。但是如果不能,我可以使用 eloquent 来做到这一点吗?我怎么知道什么时候应该使用 querybuilder?我认为 eloquent 不能做复杂的查询?我说的对吗?
【解决方案2】:

您可以在关系对象上使用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();

【讨论】:

  • 您好,谢谢,但您似乎忘记了这个条件 r.name = 'bbq'
猜你喜欢
  • 1970-01-01
  • 2022-01-09
  • 2013-01-15
  • 1970-01-01
  • 1970-01-01
  • 2020-04-20
  • 2019-09-11
  • 1970-01-01
  • 2013-12-13
相关资源
最近更新 更多