где игнорируется при фильтрации запроса laravel - PullRequest
0 голосов
/ 17 мая 2018

Я пытаюсь отфильтровать запрос к базе данных, мне интересно, возможно ли использовать whereIn для этого? В настоящее время это игнорируется.

Первый запрос работает нормально:

      $cosmeticTestAllData = DB::table('table')
            ->whereIn('part_number', ['P1', 'P2', 'P3', 'P4', 'P5', 'P6'])
            ->get();

Пример результатов:

Array    (
[0] => stdClass Object
    (
        [part_number] => P1
        [status] => FAIL
        [shipment_channel] => DP
        [created_at] => 2017-01-24 10:25:21
    )

[1] => stdClass Object
    (
        [part_number] => P2
        [status] => PASS
        [shipment_channel] => DP
        [created_at] => 2018-01-24 10:25:21
    )

[2] => stdClass Object
    (
        [part_number] => P2
        [status] => FAIL
        [shipment_channel] => DP
        [created_at] => 2018-01-24 10:25:21
    )

 )

Этот запрос корректно фильтрует предложение where, но игнорирует whereIn

        $fullCount = $cosmeticTestAllData;
        $fullCount->where('created_at', '>', '2018-01-01 00:00:00');
        $fullCount->whereIn('shipment_channel', ['ANYTHING']);
        $fullCount->whereIn('status', ['ANYTHING')];
        echo '<pre>';
        print_r($fullCount->all());die;

Результаты:

Array    (

[0] => stdClass Object
    (
        [part_number] => P2
        [status] => PASS
        [shipment_channel] => DP
        [created_at] => 2018-01-24 10:25:21
    )

[1] => stdClass Object
    (
        [part_number] => P2
        [status] => FAIL
        [shipment_channel] => DP
        [created_at] => 2018-01-24 10:25:21
    )

 )

Ответы [ 3 ]

0 голосов
/ 17 мая 2018

Полагаю (?) Вы хотите что-то вроде этого:

$rows = DB::table('table')
  ->where('created_at', '>', '2018-01-01 00:00:00')
  ->whereIn('part_number', ['P1', 'P2', 'P3', 'P4', 'P5', 'P6'], 'AND')
  ->whereIn('shipment_channel', ['ANYTHING'], 'AND')
  ->whereIn('status', ['ANYTHING'], 'AND')
  ->get();

Обратите внимание, что whereIn принимает третий (и четвертый) аргумент:

/**
 * Add a "where in" clause to the query.
 *
 * @param  string  $column
 * @param  mixed   $values
 * @param  string  $boolean
 * @param  bool    $not
 * @return \Illuminate\Database\Query\Builder|static
 */
public function whereIn($column, $values, $boolean = 'and', $not = false)
{
    $type = $not ? 'NotIn' : 'In';

    // If the value of the where in clause is actually a Closure, we will assume that
    // the developer is using a full sub-select for this "in" statement, and will
    // execute those Closures, then we can re-construct the entire sub-selects.
    if ($values instanceof Closure)
    {
        return $this->whereInSub($column, $values, $boolean, $not);
    }

    $this->wheres[] = compact('type', 'column', 'values', 'boolean');

    $this->bindings = array_merge($this->bindings, $values);

    return $this;
}

Честно говоря, не совсем понятно, что вы хотите сделать из вопроса.

0 голосов
/ 17 мая 2018

Вы, кажется, пытаетесь рассматривать коллекцию как конструктор запросов.Однако большинство операций по сбору не изменяют коллекцию.Измените свой код на:

$fullCount = $cosmeticTestAllData
       ->where('created_at', '>', '2018-01-01 00:00:00');
       ->whereIn('shipment_channel', ['ANYTHING'])
        ->whereIn('status', ['ANYTHING' ]);
    echo '<pre>';
    print_r($fullCount->all());die;

Таким образом, вы связываете результат каждой операции со следующей операцией.

В качестве альтернативы вы можете выполнить эти операции в конструкторе запросов перед выполнением запроса.

0 голосов
/ 17 мая 2018

Вместо whereIn следует попробовать orWhere во втором запросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...