Laravel Eloquent ID 作为数组键
Posted
技术标签:
【中文标题】Laravel Eloquent ID 作为数组键【英文标题】:Laravel Eloquent ID as array key 【发布时间】:2018-10-21 12:07:20 【问题描述】:在我的控制器类中,我正在获取属于当前登录用户的所有餐厅特色菜,以及特色菜的美食类型以及特色菜所属的餐厅。
我使用下面的sn-p:
public function edit(Special $special)
dd($special->with('restaurants')->with('cuisines')->get()->keyBy('id')->toArray());
这会产生:
->keyBy('id') 方法允许我将“特殊”数组键设置为数据库中的记录 ID。
但是,我不知道如何将关系记录数组键设置为它们各自的 ID。
例如。 餐厅数组中的第一项应具有“1”键。美食数组中的第一项应具有“25”键。
我尝试过这样的事情:
$special->with('restaurants')->keyBy('id')->with('cuisines')->keyBy('id')->get()->keyBy('id')->toArray()
抛出: 方法 Illuminate\Database\Query\Builder::keyBy 不存在。
我的美食和餐厅表都有一个主键 id 列。
【问题讨论】:
keyBy(...)
是收集功能,因此您需要在每个关系上“链接”此调用。我不打算在这里写整个链,但想法是 $special->with(['restaurants', 'cuisines'])->get()->keyBy('id')->first()->restaurants->keyBy('id')
... 关键是这仅适用于 first $special
所以你需要使用 transform()
或 @987654324 @.
您能否就答案提供反馈?
【参考方案1】:
使用这个:
$special->with($relations = ['restaurants', 'cuisines'])->get()->keyBy('id')
->each(function($special) use($relations)
foreach($relations as $relation)
$special->setRelation($relation, $special->$relation->keyBy('id'));
);
【讨论】:
【参考方案2】:这应该可以解决问题:
$result = $special->with(['restaurants', 'cuisines'])->get()->keyBy('id')->map(function ($item)
$item->restaurants->keyBy('id');
$item->cuisines->keyBy('id');
return $item;
);
或者稍微好一点的版本:
$result = $special->with(['restaurants', 'cuisines'])->get()->keyBy('id')->map(function ($item)
foreach (array_keys($item->getRelations()) as $relation)
if ($item->relationLoaded($relation))
$item->$relation->keyBy('id');
return $item;
);
【讨论】:
【参考方案3】: $result = $special->with(['restaurants', 'cuisines'])->get()
->keyBy('id')
->map(function ($item)
$item->restaurants->keyBy('id');
$item->cuisines->keyBy('id');
return $item;
);
【讨论】:
@kyslik 差不多了。 是的,我在那里 :) 你需要返回$item以上是关于Laravel Eloquent ID 作为数组键的主要内容,如果未能解决你的问题,请参考以下文章
遍历数组集合并返回命名键值对(Laravel/Eloquent)
Laravel Eloquent truncate - 外键约束