我有两个表(n:m)通过像这样的数据透视表连接:
食谱(id,name)
用户(id,playerId)
recipe_user (recipeId,userId)
目前我从我的移动应用程序中获取数据,如/ api / v1 / recipes,并获取所有食谱的列表。
现在我想添加一个范围,我可以在其中传递app用户的Player-ID(通过API请求的header-data),并在查询结果中添加is_bookmarked
字段。最后它应该是这样的:
[
{
"id": 1,
"name": "Pizza",
"is_bookmarked": 1
},
{
"id": 1,
"name": "Pizza",
"is_bookmarked": 1
}
]
我怎样才能注射"这个额外选择我的查询?
目前查询可能非常简单:Recipe::get()
答案 0 :(得分:1)
您应首先连接表,然后手动将is_bookmarked
列添加到查询中。以下是基于您提供的信息的示例。
$userId = 1; // Get an app user id.
$recipes = Recipe::select('recipes.*')
->leftJoin('recipe_user', function ($join) use ($userId) {
return $join
->on('recipe_user.recipeId', '=', 'recipes.id')
->on('recipe_user.userId', '=', DB::raw($userId));
})
->addSelect(DB::raw('recipe_user.recipeId AS is_bookmarked'))
->get();
答案 1 :(得分:0)
假设它是一个任意值;对于雄辩,您可以将属性直接添加到模型实例,如:
$temp = App\Recipe::first();
$temp->is_bookmarked = 1;
return $temp;
答案 2 :(得分:0)
假设您获得的每个食谱实例都是一个集合,您可以通过以下方式添加is_bookmarked
列:
$bookmark = $request->hasHeader('user_id');
$data = $recipes->map(function($recipe) use($bookmark) {
if ($bookmark === true) {
$bookmark->push(['is_bookmarked' => 1]);
}
return $bookmark;
});