Nano Hash - криптовалюты, майнинг, программирование

Laravel MySQL, где закрытие не работает должным образом

Может ли кто-нибудь помочь объяснить, почему один из следующих запросов Laravel работает, а другой нет?

Первое, что работает:

$array = ( 1, 2, 3 ,4 );
$query->whereIn( 'status_id', $array );

Это работает, как и ожидалось. Однако, когда я пытаюсь передать функцию для построения моего массива:

$query->whereIn( 'status_id', function() use ( $statuses ){
    $status_array = array();
    foreach( $statuses as $status ){
         $status_array[] = $status->status_id;
    }

    return $status_array;
});

Я получаю следующую ошибку:

Общая ошибка: 1096 Таблицы не используются (SQL: выберите * из jobs, где status_id в (выберите *))

Я проверил, что массив, который я создаю в замыкании, совпадает с массивом, который работает, и это так. Я упустил что-то фундаментальное в отношении whereIn() и его функций закрытия? Могу ли я даже передать замыкание в whereIn()?

20.06.2014

  • Что произойдет, если вы вернете массив (1, 2, 3, 4) из функции - это работает? 20.06.2014

Ответы:


1

Когда вы используете замыкание в whereIn(), Laravel будет думать, что вы будете выполнять подзапрос. Следовательно, вы видите еще один select внутри вашего in в своем сообщении об ошибке.

Вам нужно будет проанализировать массив значений, прежде чем переходить к whereIn()

foreach ($statuses as $status) {
     $status_array[] = $status->status_id;
}

$query->whereIn('status_id', $status_array);

Дополнительно: см. ссылку на исходный код Laravel.

Illuminate\Database\Query\Builder:

public function whereIn($column, $values, $boolean = 'and', $not = false)
{
    ...

    if ($values instanceof Closure)
    {
        return $this->whereInSub($column, $values, $boolean, $not);
    }
}

который вызывает whereInSub():

protected function whereInSub($column, Closure $callback, $boolean, $not)
{
    $type = $not ? 'NotInSub' : 'InSub';

    // To create the exists sub-select, we will actually create a query and call the
    // provided callback with the query so the developer may set any of the query
    // conditions they want for the in clause, then we'll put it in this array.
    call_user_func($callback, $query = $this->newQuery());

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

    $this->mergeBindings($query);

    return $this;
}
20.06.2014
  • Это то, что я в итоге сделал, с комбинацией из ответа Shift Exchange выше. Принял этот ответ, поскольку вы также дали мне хорошее объяснение, почему все пошло не так, как я ожидал. Спасибо :) 20.06.2014

  • 2

    В качестве связанного ответа: вместо запуска цикла для создания списка - просто пусть Laravel сделает это за вас

     $status_array= DB::table('status')->lists('status_id');
    

    затем используйте его

     $query->whereIn( 'status_id', $status_array );
    
    20.06.2014
  • Спасибо, это прекрасная маленькая функция, которая экономит дополнительный foreach :) 20.06.2014

  • 3

    Я думаю, что ваша функция возвращает такой массив:

    [ 0 => status_id_value_0,
      1 => status_id_value_1, 
      ...
    ] 
    

    Попробуйте вернуть array_values($status_array), чтобы проверить это.

    В любом случае, попробуйте и это:

    $query->whereIn( 'status_id', 
                     array_values(
                         array_map(
                             function($pos){return $pos->status_id;},
                             $statuses
                         )
                     )
                   ); 
    

    Я надеюсь, что это работает хорошо для вас.

    20.06.2014

    4

    Вам нужно преобразовать значение, разделенное запятыми, в массив перед переходом в whereIN.

    и это также хорошо для любого динамического контента

        foreach ($statuses as $status) {
             $status_array[] = $status->status_id;
        }
        $query->whereIn('status_id', $status_array);
    
    13.01.2016
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..