Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 04.09.2017 12:42:36

whereIn возвращает не точное совпадение

Здравствуйте. Есть вот такой запрос

    /**
     * Find product variation by it attribute
     *
     * @param array $attributes
     */
    private function setVariation(array $attributes = [])
    {
        $this->variation = ProductAttribute::whereHas('combinations', function($q) use($attributes){
            $q->whereIn('product_attribute_combination.attribute_id', $attributes);
        })->first();
        dd($this->variation, $attributes);
    }

Массив $attributes выглядит так:

array:2 [
  0 => "8"
  1 => "13"
]

Вот сама таблица product_attribute_combination
http://www.fotolink.su/pic_b/72078c2b80 … b369fe.png
Ожидаю получить product_attribute_id 32, а он возвращает 9. Почему?
Если поставить вместо first(), get(). то вернется коллекция из 10 элементов. Как можно сделать строгий запрос?

Не в сети

#2 04.09.2017 13:40:11

Re: whereIn возвращает не точное совпадение

Не совсем понятно что вам нужно. first - возвращает первый элемент массива. get - коллекцию по заданному параметру.
Что именно нужно выбрать?

Не в сети

#3 06.09.2017 15:32:57

Re: whereIn возвращает не точное совпадение

  1. Не совсем понятно что вам нужно. first — возвращает первый элемент массива. get — коллекцию по заданному параметру.Что именно нужно выбрать?

Вот есть таблица product_attribute_combination, она является связной таблицей между product_variation и attributes
В этой таблице такая структура и заполненые данные

id | attribute_id | product_variation_id
1    1              9
2    2              9
3    1              10
4    3              10
5    2              11
6    3              11
...

Я хочу получить product_variation_id как бы сказать основываясь что ли на пришедших от пользователя айдишников attribute_id.
Допустим пришли 2 айдишника.

array:2 [
  0 => "2"
  1 => "3"
]

Делаем запрос

PHP
        ProducVariations::whereHas('combinations', function($q) use($attributes){ // $attributes это тот массив который выше
            
$q->whereIn('product_attribute_combination.attribute_id'$attributes);
        })->
first();

по идеи я должен был получить product_variation_id #11 тат как у него attribute_id #2 и #3, но запрос возвращает не 11, а 9. Почему? Будто whereIn('product_attribute_combination.attribute_id', $attributes) возвращает найденную запись по первому числу в массиве, а второе число игнорирует.

Не в сети

#4 06.09.2017 16:29:50

Re: whereIn возвращает не точное совпадение

У тебя в таблице есть повторения attribute_id.
для attribute_id = 2, product_variation_id = [9, 11]
->first(); как раз и возвращает первое вхождение - product_variation_id = 9.

если нужно получить product_variation_id который соответствует attribute_id = 2 И attribute_id = 3, то нужен не whereIN,
а ->where() .. ->andWhere()...

Не в сети

#5 12.10.2017 17:43:15

Re: whereIn возвращает не точное совпадение

Совсем забыл про этот пост. Спасибо за ответ. Но с where andWhere так же возвращает неточное значение

Не в сети

Подвал раздела