2015-01-21 552 views
4

在Laravel 4.2中,我有一个名为Product的模型,其中包含许多与其他模型(如Country或Category)的多对多关系。我想过滤掉“不完整”的产品,这意味着它们没有关联的国家或没有关联的类别。我可以使用whereDoesntHave()方法过滤掉一个关系。当我在一次查询中使用它两次时,它会创建AND条件,但我需要OR。我在API文档中找不到orWhereDoesntHave()方法。我不能将多个关系作为参数传递,因为它期望第一个参数是一个字符串。Laravel whereDoesntHave() - 多个或条件

我需要的是这样的: $products = Product::whereDoesntHave('categories')->orWhereDoesntHave('countries')->get();

有什么办法才达到whereDoesntHave()OR条件?

回答

5

您可以使用doesntHave并指定布尔运算符:

$products = Product::doesntHave('categories')->doesntHave('countries', 'or')->get(); 

其实你只需要whereDoesntHave如果你想在一个封闭通过检查其中是否存在之前过滤的相关模型。如果你想这样做,你可以通过封闭作为第三个参数:

$products = Product::doesntHave('categories', 'or', function($q){ 
    $q->where('active', false); 
})->doesntHave('countries', 'or')->get(); 
+0

谢谢,我在阅读API时错过了'doesntHave()'。你的第一个代码示例正是我需要的。 – KazikM 2015-01-21 13:33:26