【发布时间】:2015-06-13 04:07:53
【问题描述】:
我正在尝试清理我编写的一些代码。
这是当前代码:
$message = Message::with('comments')
->join('users', 'messages.created_by', '=', 'users.id')
->join('team_user', 'messages.created_by', '=', 'team_user.user_id')
->join('teams', 'team_user.team_id', '=', 'teams.id')
->join('roles', 'team_user.role_id', '=', 'roles.id')
->select('messages.id', 'messages.message', DB::raw('CONCAT(users.first_name, " ", users.last_name) AS created_by_name'), DB::raw('CONCAT(roles.name, " ", teams.name) AS function'))
->findOrFail($id);
我试着把它变成这样:
$message = Message::with('comments')
->join('users', 'messages.created_by', '=', 'users.id')
->withFunction()
->findOrFail($id);
所以我创建了一个名为 withFunction 的作用域,如下所示:
return $query->join('team_user', 'messages.created_by', '=', 'team_user.user_id')
->join('teams', 'team_user.team_id', '=', 'teams.id')
->join('roles', 'team_user.role_id', '=', 'roles.id')->select(DB::raw('CONCAT(roles.name, " ", teams.name) AS function'));
但是因为我在选择特定列的地方使用了这个范围,所以我也不能在我的查询中使用 select。我希望它看起来像这样:
$message = Message::with('comments')
->join('users', 'messages.created_by', '=', 'users.id')
->withFunction()
->select('messages.id', 'messages.message')
->findOrFail($id);
所以我指定了从范围和查询本身返回的列。我知道我在一个查询中不能有 2 个选择,但是有什么办法可以做到吗?
如果您可以只返回范围内的列以在整个应用程序中使用它,那就太好了。
【问题讨论】:
-
在单独的方法中移动一半的查询有什么意义?您可以将 how 请求放在单独的 Message 方法中,并在需要时调用它。但这只有在它在其他多个地方请求时才保持原样..
-
尝试使用
addSelect()并告诉我是否可行。->withFunction()->addSelect('messages.id', 'messages.message') -
您可以使用 Eloquent Relation 清理复杂的连接
-
@NyanLynnHtut 好主意!尽管有一个缺点,但关系会增加数据库查询的数量。 (尽管在许多情况下这并不重要)
-
@NyanLynnHtut 我将如何将其创建为雄辩的关系。因为我只是在正常结果中添加了一个用户额外的功能。我也不想在每个 Message 模型中都查询该函数。
标签: php laravel eloquent laravel-5