2016-09-20 253 views
1

如何创建括号我orWhere:Laravel belongsToMany与OR条件

public function categories() 
{ 
    return $this->belongsToMany('App\Category', 'user_category')->orWhere('default', 1); 
} 

所以它转换为这样的:

where (`user_category`.`user_id` = ? or `default` = 1) 

目前这里的括号缺失扰乱了整个查询。我试过,例如:

public function categories() 
{ 
    $join = $this->belongsToMany('App\Category', 'user_category') 
     ->orWhere('default', 1); 
    return $this->where(function ($query) use ($join) { 
     return $join; 
    }); 
} 

但现在我失去我的模型,并获得Call to undefined method Illuminate\Database\Query\Builder::...

回答

0

您可以使用advanced where clause像:

Model::where(function ($query) { 
    $query->where('a', '=', 1) 
      ->orWhere('b', '=', 1); 
})->where(function ($query) { 
    $query->where('c', '=', 1) 
      ->orWhere('d', '=', 1); 
}); 

或嵌套条款like

Model::where(function($query) 
{ 
    $query->where('a', 'like', 'keyword'); 
    $query->or_where('b', 'like', 'keyword'); 
}) 
->where('c', '=', '1'); 
+0

这就是我所尝试过的。但是这对'belongsToMany'有效吗? $ query-> belongsToMany()在这个函数中不起作用。这就是为什么我试图用'use($ join)'来获取它,但仍然无法使用。 – PiTheNumber

0

你想获得所有的类别与用户相关的字段以及default字段为1的类别?

如果是这样的情况下:

public function categories() 
{ 
    return $this->belongsToMany('App\Category'); 
} 

public function relatedCategories() 
{ 
    return App\Category::all()->where('default',1)->merge($this->categories); 
} 

relatedCategories()方法应返回的集合与期望的类别。请注意,与default=1不相关的类别不会有pivot对象,因为这些类别在数据透视表中不存在。

+0

对,看起来不错,但它仍然会返回类别模型。 'categories()'返回BelongsToMany对象和用户模型作为父类,所以你仍然可以从用户调用查询范围方法。 – PiTheNumber