2015-12-17 5 views
1

У меня есть таблица элементов, таблица Meta и таблица Item_Meta, которая имеет все мета-записи для элементов. У одного предмета есть много метаданных.Laravel Несколько требований к отношениям

Item_meta имеет следующие столбцы: Item_id | Meta_id | Значение

Допустим, у меня есть требования: Требование 1 - [ 'Meta_id' => 1, 'значение' => 'новый'] Требование 2 - [ 'Meta_id' => 3, 'значение' => 'LCD']

Мне нужно построить запрос, чтобы получить все элементы, у которых есть meta_id с id 1, равным новому, и meta_id с id 3, равным ЖК-дисплею.

Так что, если у предмета нет одного из этих мета (или один из метасов имеет неправильное значение), он не должен возвращаться.

ответ

2

Вы можете отфильтровать свои модели по атрибутам отношения, используя метод Eloquent's 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(); 

Я предположил, что ваш item-> мета отношение называется METAS.

Вы также можете использовать другую форму с помощью гдеHas(), где вы указываете количество соответствующих записей. Код будет немного сложнее, но это приведет к менее подзапросы в выполненном запросе:

$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 this this this this this this this this this this this is this is this this is this is the request this this is this is this is this is this is this is this is the request this this is this is this is this is the request this this is this is this is this is this is this is this is this is this is this is Вот код:

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; 
} 

замечать "$ this-> query-> addNestedWhereQuery ($ query-> GetQuery(), $ булево);" на 6-й линии.

Метод 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 метод , мне нужно было назначить whereHas результат для переменной:

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); 
    }) 
} 

Вот и все.Всегда проверяйте с внутренними деталями, если что-то работает неудивительно

Смежные вопросы