Laravel MySQL在关闭时没有按预期工作

时间:2014-06-20 07:53:25

标签: php mysql laravel

任何人都可以帮忙解释为什么下面的一个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:select * from jobs where   status_id in(select *))

我已经检查过,我在闭包中构建的数组与工作的数组相同,而且确实如此。我错过了关于whereIn()及其闭包函数的基本信息吗?我甚至可以将闭包传递给whereIn()?

4 个答案:

答案 0 :(得分:4)

作为一个相关的答案,而不是运行循环来生成列表 - just have Laravel do it for you

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

然后使用它

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

答案 1 :(得分:4)

当您在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;
}

答案 2 :(得分:1)

我认为你的函数返回一个像这样的数组:

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

我希望它适合你。

答案 3 :(得分:0)

在传递给whereIN之前,您需要将逗号分隔值转换为数组。

这也适用于任何动态内容

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