Laravel 5 Eloquent作用域:连接和选择特定列

21

我有一个Eloquent模型,在该模型中,我使用一个作用域查询来执行联接。这一切都很好,但是我正试图弄清楚如何在作用域查询中仅从连接的表中选择某些列。

这是我控制器中的方法:

$accounts = Account::creator()->get();

这是模型中的范围查询

public function scopeCreator($query) {
        $query->leftJoin('users','users.id','=','accounts.creator_id');
}
这个方法可以用,但是它会返回accounts和users表中所有列的数据,而我只想要accounts表中的所有列和users表中的2个列。
我尝试了这个...
public function scopeCreator($query) {
        $query->leftJoin('users','users.id','=','accounts.creator_id')->select(array('id','user_name'));
}

但是,这只返回用户中的那2个字段,并忽略了账户中的列。我知道如何使用2个不同的模型解决此问题,但这意味着我必须创建一个无用的模型。如果我可以弄清楚这一部分,这个查询功能将非常好用。

2个回答

32

你可以尝试这个:

->select('accounts.*', 'users.id as uid','users.user_name');

0
不过这篇文章已经很旧了。。
我想指出以下几点:
如果你使用selectRaw
->selectRaw('`users`.`id` as uid');

在这种情况下,它不会替换原始选择,而是添加额外的列。据我所知,这并没有被记录下来。如果您想链接多个加入范围,这非常有用。
此外,如果您不知道原始选择语句,它可能是动态的。
此外,您可以扩展/覆盖默认的“newQuery”方法,以更改使用作用域时的默认行为
像这样
    public function newQuery($excludeDeleted = true): Builder
    {
        return parent::newQuery($excludeDeleted)->select('table_name.*');
    }

然而,我建议使用selectRaw而不是更改newQuery()的默认行为,因为在某些情况下这可能会导致麻烦或冲突。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接