2015-12-17 42 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); 
    }) 
} 

這就是所有。經常檢查內部是否有意義的工作