gui*_*sen 3 php laravel eloquent laravel-5
我正在尝试清理我制作的一些代码.
这是当前的代码:
$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);
Run Code Online (Sandbox Code Playgroud)
我试着这样做:
$message = Message::with('comments')
->join('users', 'messages.created_by', '=', 'users.id')
->withFunction()
->findOrFail($id);
Run Code Online (Sandbox Code Playgroud)
所以我做了一个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'));
Run Code Online (Sandbox Code Playgroud)
但是因为我在选择特定列时使用了这个范围,所以我也不能在查询中使用select.我希望它看起来像这样:
$message = Message::with('comments')
->join('users', 'messages.created_by', '=', 'users.id')
->withFunction()
->select('messages.id', 'messages.message')
->findOrFail($id);
Run Code Online (Sandbox Code Playgroud)
所以我指定从作用域和查询本身返回的列.我知道我在查询中不能有2个选择,但是有什么方法可以实现吗?
如果您可以只返回范围中的列以在整个应用程序中使用它,那将会很棒.
问题似乎归结为get() 的工作方式。
$original = $this->columns;
if (is_null($original)) {
$this->columns = $columns;
}
Run Code Online (Sandbox Code Playgroud)
如果未定义其他选择,则 Get 仅添加 '*' 以进行选择。
您要么需要显式调用select('*')构建器
$message = Message::with('comments')
->select('*')
->join('users', 'messages.created_by', '=', 'users.id')
->withFunction()
->select('messages.id', 'messages.message')
->findOrFail($id);
Run Code Online (Sandbox Code Playgroud)
或将其添加到您的范围中,这是来自 5.3 项目的示例。
public function apply(Builder $builder, Model $model)
{
if(is_null($builder->getQuery()->columns)){
$builder->addSelect('*');
}
$builder->addSelect(DB::raw('...'));
}
Run Code Online (Sandbox Code Playgroud)
看看addSelect().当您使用select()时,您将覆盖所有其他所选列,并仅选择一列.通过使用addSelect(),您可以将列附加到选定的列而不是替换它.
因此,作为一般规则,您应在调用任何添加列的作用域之前调用select(),并且这些作用域应使用addSelect().
另外......您实际上不需要在范围内返回$ query,因为您正在与查询构建器对象进行交互.它有点像旧学校参考(&).
| 归档时间: |
|
| 查看次数: |
4231 次 |
| 最近记录: |