Laravel:DB查询返回stdclass而不是数组

时间:2019-05-04 16:06:45

标签: mysql laravel

我有以下内容:

$srv = DB::table('ads')
    ->join('ad_service','ad_service.ad_id', '=', 'ads.id')
    ->select('ads.id')
    ->whereIn('ads.id',[45789,46531])
    ->get();
    Log::info($srv);

日志信息给了我

  49 =>   stdClass::__set_state(array(
 'id' => '46531',
  )),
  50 => 
  stdClass::__set_state(array(
 'id' => '46531',
  )),
  51 => 
  stdClass::__set_state(array(
 'id' => '46531',
  )),

我想拥有的东西:
返回条目一次,“ ad_service”表中有多个具有此ID的条目,我想检索一次。 这是多对多的关系。 还有最大的问题,这个stdclass设置状态是什么?
我期待着这样的事情:

array('id' => '46531', ...,)

谢谢大家。

编辑: 使用口才解决了它:

$srv = Ad::whereIn('id',[46696,48982,...MORE IDS HERE])->get();

这不返回对象而是一个集合本身。我真的不知道@ourmandave对“您将获得带有std类对象的集合”的含义是什么,我的意思是显然可以看到,但我并不真正知道为什么得到它,以及为什么我希望如雄辩地得到它。 任何答案,将不胜感激: 为什么DB ::返回此std类的内容,而Eloquent返回“需要的格式”?

3 个答案:

答案 0 :(得分:1)

您实际上正在找回lararvel Collection。

从文档(https://laravel.com/docs/5.8/queries#retrieving-results

  

get方法返回一个Illuminate \ Support \ Collection,其中包含   结果,其中每个结果都是PHP stdClass对象的实例。   您可以通过以下方式访问各列的值:   对象的属性:

foreach ($users as $user) {
  echo $user->name; 
}

它们为集合提供了很多方法来将它们视为数组。 (https://laravel.com/docs/5.8/collections#available-methods

您也可以尝试distinct()方法以获取倍数之一。

  $srv = DB::table('ads')
    ->join('ad_service','ad_service.ad_id', '=', 'ads.id')
    ->select('ads.id')
    ->whereIn('ads.id',[45789,46531])
    ->distinct()
    ->get();

答案 1 :(得分:1)

如果您只想要一项记录,可以尝试:

$srv = DB::table('ads')
        ->join('ad_service','ad_service.ad_id', '=', 'ads.id')
        ->select('ads.id')
        ->whereIn('ads.id',[45789,46531])
        ->first();

将获取更改为first()。您获得多条记录的原因是因为get()返回了您的广告的laravel collection

答案 2 :(得分:0)

要将模型及其加载的关系转换为数组,应使用toArray方法。此方法是递归的,因此所有属性和所有关系(包括关系的关系)都将转换为数组

$srv = DB::table('ads')
    ->join('ad_service','ad_service.ad_id', '=', 'ads.id')
    ->select('ads.id')
    ->whereIn('ads.id',[45789,46531])
    ->get()
    ->toArray();

打印数组:

Log::info($srv);