我有以下内容:
$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返回“需要的格式”?
答案 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);