向查询添加其他字段

时间:2017-11-04 19:19:35

标签: laravel laravel-5.5

我有两个表(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()

3 个答案:

答案 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;
});