【问题标题】:Laravel 5 Eloquent ORM select where - array as parameterLaravel 5 Eloquent ORM 选择 where - array 作为参数
【发布时间】:2016-10-09 12:12:19
【问题描述】:

我正在从数据库中获取grade_id:

$grade_id = DB::table('grades')->where('teacher_id',$teacher_id)->select('grade_id')->get();

然后我想在 where eloquent 子句中使用那个grade_id 数组,所以我运行

$home_feed = Home::join('home_grade', 'home_grade.home_id', '=', 'homes.id')
                               ->whereIn('grade_id', $grade_id)
                               ->get();

但是当我运行它时,我得到一个错误:Object of class stdClass could not be converted to string

可能是什么问题?谢谢大家。

【问题讨论】:

  • 试试$grade_id = DB::table('grades')->where('teacher_id',$teacher_id)->select('grade_id')->first();
  • 你的第一个查询可能返回集合对象,所以尝试$grade_id = DB::table('grades')->where('teacher_id',$teacher_id)->select‌​('grade_id')->get()-‌​>lists('grade_id')->‌​all();DB::table('grades')->where('teacher_id',$teacher_id)->pluck('grade_id')->all() 然后第二个查询

标签: mysql laravel laravel-5 eloquent


【解决方案1】:

根据 laravel 版本,你的 $grade_id 要么是一个数组,要么是一个对象的集合。您需要的是一个数组或一组值。 您可以使用 select()pluck() 方法来实现这一点,就像 IzzEps 建议的那样。

但是您可以通过将子查询传递给whereIn() 方法来获得相同的结果:

$gradeSubquery = DB::table('grades')->where('teacher_id',$teacher_id)->select('grade_id');

$home_feed = Home::join('home_grade', 'home_grade.home_id', '=', 'homes.id')
                 ->whereIn('grade_id', $gradeSubquery)
                 ->get();

这样您将只运行一个查询而不是两个。

更新: 在 5.2 版之前,您必须使用 lists() 而不是 pluck()whereIn() 方法不接受 Builder 作为第二个参数。要获得相同的查询,您需要使用闭包:

$home_feed = Home::join('home_grade', 'home_grade.home_id', '=', 'homes.id')
    ->whereIn('grade_id', function($query) use($teacher_id) {
        $query->from('grades')
            ->where('teacher_id', $teacher_id)
            ->select('grade_id');
    })
    ->get();

【讨论】:

  • 当我使用子查询时,我收到以下错误Argument 1 passed to Illuminate\Database\Grammar::parameterize() must be of the type array, object given
  • 你的 laravel 版本是什么?
  • @user3714932 我在 5.2.39 上测试了以下代码:$subQuery = DB::table('categories')->where('name', $catName)->select('id'); $products = App\Product::join('category_product as cp', 'cp.product_id', '=', 'products.id')->whereIn('category_id', $subQuery)->get();。它执行以下工作查询:select * from `products` inner join `category_product` as `cp` on `cp`.`product_id` = `products`.`id` where `category_id` in (select `id` from `categories` where `name` = ?).
  • 我用的是 5.0,也许这就是原因
  • @user3714932 你说得对 - 在 v5.2 之前不支持 :-( (刚刚签入 laravel 源代码)。
【解决方案2】:

您的第一个查询返回一个集合,而不是grade_id。

试试这个:$grade_id = DB::table('grades')->where('teacher_id',$teacher_id)->pluck('grade_id');

【讨论】:

  • Collection 不是问题。问题是它包含对象,而whereIn() 需要一个简单值的数组/集合。但是您的代码似乎是正确的。
  • 当我使用 pluck 时,只返回一个结果(第一个)。
【解决方案3】:

使用列表有效。 $grade_id = Grade::where('teacher_id', $teacher_id)->lists('grade_id'); 他们返回一个数组而不是一个集合

【讨论】:

    【解决方案4】:

    您需要正确创建数组。为此,请使用 Eloquent 使用的两个函数:pluck()toArray()。看下面的例子:

    $grade_id = DB::table('grades')->where('teacher_id',$teacher_id)->pluck('grade_id')->toArray();
    

    【讨论】:

      猜你喜欢
      • 2013-07-10
      • 2020-07-09
      • 2014-08-19
      • 2016-06-13
      • 1970-01-01
      • 1970-01-01
      • 2015-05-16
      • 2015-04-16
      • 1970-01-01
      相关资源
      最近更新 更多