2015-12-17 45 views
1

我有一个Item表,Meta表和一个Item_Meta表,它具有Items的所有元记录。一个项目有许多元记录。Laravel关系的多重要求

Item_meta包含以下列: Item_id | Meta_id |值

可以说我有一个要求: 要求1 - [ 'Meta_id'=> 1, '值'=> '新'] 要求2 - [ 'Meta_id'=> 3 '值'=> 'LCD']

我需要建立一个查询获取所有项目,其中ID为1的meta_id等于新的,以及ID为3的meta_id等于LCD。

所以,如果一个项目没有这种元素之一(或元素之一有错误的值),它不应该返回。

回答

2

您可以使用Eloquent的whereHas()方法过滤关系属性上的模型。在你的情况下,下面的代码应该做的伎俩:

$items = Item::whereHas('metas', function($query) { 
    $query->where('Meta_id', 1); 
    $query->where('value', 'new); 
}) 
->whereHas('metas', function($query) { 
    $query->where('Meta_id', 3); 
    $query->where('value', 'LCD); 
}) 
->get(); 

我认为你的用品 - >元关系称为METAS

您也可以使用其他形式的使用whereHas()您可以在其中提供匹配的相关记录数。该代码将是一个有点复杂,但它会导致在执行的查询少子查询:

$items = Item::whereHas('metas', function($query) { 
    $query->where('Meta_id', 1); 
    $query->where('value', 'new); 
    $query->orWhere(function($query2) { 
    $query2->where('Meta_id', 3); 
    $query2->where('value', 'LCD); 
    }; 
}, '=', 2) 
->get(); 
0

我试图从以前的答案第一种方式问这个问题之前,但失败了,所以我想它有一个失误。但看到和答复后,似乎我不明白的东西。所以我在Laravel Eloquent内部进行了挖掘,这里是我发现的:

Eloquent构建类“:: where”方法在返回实例之前更改$ this-> query属性。下面是代码:的 “$这个 - >查询 - > addNestedWhereQuery($查询 - > getQuery(),$布尔值);”

public function where($column, $operator = null, $value = null, $boolean = 'and') 
{ 
    if ($column instanceof Closure) { 
     $query = $this->model->newQueryWithoutScopes(); 

     call_user_func($column, $query); 

     $this->query->addNestedWhereQuery($query->getQuery(), $boolean); 
    } else { 
     call_user_func_array([$this->query, 'where'], func_get_args()); 
    } 

    return $this; 
} 

采取通知在第六行。

Builder类“:: whereHas”方法不会修改“$ this-> query”属性。

public function whereHas($relation, Closure $callback, $operator = '>=', $count = 1) 
{ 
    return $this->has($relation, $operator, $count, 'and', $callback); 
} 

那么,它与我的问题有什么关系。我创建了一个这样的查询:

$query = Item::where('active',1); 

然后我说的条件:进行

if($meta){ 
    $query->whereHas('metas', function($query) { 
     $query->where('Meta_id', 1); 
     $query->where('value', 'new); 
    }) 
    ->whereHas('metas', function($query) { 
     $query->where('Meta_id', 3); 
     $query->where('value', 'LCD); 
    }) 
} 

,然后查询:

$query->get(); 

的错误是:: whereHas方法有关,我必须做的是将变量的结果赋值给where变量:

if($meta){ 
    $query = $query->whereHas('metas', function($query) { 
     $query->where('Meta_id', 1); 
     $query->where('value', 'new); 
    }) 
    ->whereHas('metas', function($query) { 
     $query->where('Meta_id', 3); 
     $query->where('value', 'LCD); 
    }) 
} 

这就是所有。经常检查内部是否有意义的工作