2015-10-11 4 views
0

Я хочу получить изображения других продуктов.Красноречивые коллекции Где Условие

dd($alternativeProduct->pictures); 

Когда умирают и сбрасывают, я получаю этот результат.

enter image description here

мне нужно получить только изображение, которое является основным. Если main равно 1. Это основное изображение.

Когда я пишу

dd($alternativeProduct->pictures->where('main', 1)) 

Я получил пустой массив.

enter image description here

Вот мое отношение с продуктом и отношения Picture

public function pictures(){ 
    return $this->hasMany('App\Models\ProductPicture'); 
} 

Что я могу сделать?

+0

Пожалуйста, разместите отношение, которое у вас установлено для фотографий в вашей модели продукта. – Bogdan

+0

Я добавил соотношение –

ответ

0

where метод в коллекции имеет три параметра: $key, $value и $strict, последний по умолчанию используется true, если не прошло при вызове метода. Когда $strict истинно, сравнение выполняется через ===, который не делает принуждение типа, то есть "1" === 1 является ложным.

Из ваших данных дампа, я могу видеть, что "main" => "1" что означает, что строка и вы передаете целое 1 методы where, в результате чего я описал выше как ложное условие и возвращает пустой результирующий набор. Вы можете исправить это, отключив строгое сравнение:

$alternativeProduct->pictures->where('main', 1, false); 
// or the equivalent helper whereLoose 
$alternativeProduct->pictures->whereLoose('main', 1); 

Или передача строки в качестве значения:

$alternativeProduct->pictures->where('main', "1"); 

, как говорится, если это единственное место, где вы используете эту коллекцию в в этом запросе, я предлагаю отфильтровать результаты на уровне базы данных, а не после их получения:

$alternativeProduct->pictures()->where('main', 1)->get(); 

Доступ к отношениям как методу ->pictures(), а не как свойство ->pictures, вернет экземпляр Query Builder, который позволяет добавлять условия к запросу базы данных и получать только нужные элементы из базы данных, вместо того, чтобы получать их все и отфильтровывая их потом.

0

Вы можете использовать вместо whereLoose:

dd($alternativeProduct->pictures->whereLoose('main', 1))

Из документов Laravel:

где метод использует строгие сравнения при проверке значений элементов. Используйте метод whereLoose для фильтрации, используя «свободные» сравнения.

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