在Laravel的Where子句中将值作为数组传递

时间:2016-01-20 10:14:10

标签: mysql laravel-5.1

我在$qids中有一个数组 [{"qid":1},{"qid":2},{"qid":3},{"qid":4}],现在,我希望从数据库中获取与这些qid值匹配的行。我正在研究我的Laravel项目,我正在使用的where子句如下

$questions = Question::where(function($q) use ($qids){
    foreach($qids as $key => $value){
        $q->where($key, '=', $value);
    }
})->get();

这给了我一个错误

*SQLSTATE[42S22]: Column not found: 1054 Unknown column '0' in 'where clause' (SQL: select * from `questions` where (`0` = {"qid":1} and `1` = {"qid":2} and `2` = {"qid":3} and `3` = {"qid":4}))*

正如我所看到的,在错误行中

where (`0` = {"qid":1} and `1` = {"qid":2} and `2` = {"qid":3} and `3` = {"qid":4})

它将0,1,2,3作为键,整个{“qid”:1}作为值。

仅供参考,我从声明中生成$qids

$qids = Examquestion::select('qid')->where('examid', $examid)->get();

有什么方法可以只保存$qids中的值而不是对。 希望你了解这个场景。 TIA。

5 个答案:

答案 0 :(得分:5)

使用此代替

$qids = Examquestion::where('examid', $examid)->lists('qid');

然后在

中使用此数组
$questions = Question::whereIn('qid', $qids)->get();

你会得到你的结果

答案 1 :(得分:2)

由于qid是重复的,因此是多余的,您可以展平数组,并使用whereIn子句:

Question::whereIn('qid', array_flatten($qids));

答案 2 :(得分:1)

您提供的关联数组格式是错误的:

我尝试下面的例子......它的工作对我很好。

$ qids = array(" a" =>"苹果"," b" =>"橙子" ," c" =>" Pears");

    $questions = Question::where(function($q) use ($qids)
{
   foreach($qids as $key => $value)
   {

    $q->where($key, '=', $value);
   }
})->get();

答案 3 :(得分:0)

谢谢大家。我的代码在你的帮助下工作了。这是我的工作代码片段。

$qids = Examquestion::select('qid')->where('examid', $examid)->lists('qid');
$questions = Question::select('qid','question','answer','option1','option2','option3','hint')
             ->whereIn('qid', $qids)
             ->get();

答案 4 :(得分:0)

案例:当您必须在where条件下进行数组排列时,您可能会遇到大小写问题($ option是array,对于使用BINARY的大小写敏感):-

$option = DB::table('test_results')->whereIn('user_id',$form_id)->pluck('answer'); $answer = Db::table('answer_keys')->whereIn(DB::raw('BINARY 'option''), $option)->get('answer');