Laravel 5 Eloquent 范围联接和 select 特定列

Laravel 5 Eloquent scope join and select specific columns

我有一个 Eloquent 模型,在该模型中我使用范围查询进行连接。这一切都很好,但我试图弄清楚如何在范围内查询 select 仅来自加入的 table.

的某些列

这是我控制器中的方法。

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

这是模型中的范围查询

public function scopeCreator($query) {
        $query->leftJoin('users','users.id','=','accounts.creator_id');
}

这有效,但它 returns 所有 帐户和用户的列,但我只想要帐户的所有列和用户的 2 列。

我试过了...

public function scopeCreator($query) {
        $query->leftJoin('users','users.id','=','accounts.creator_id')->select(array('id','user_name'));
}

然而,这 returns 仅来自用户的那 2 个字段,而忽略来自帐户的列。我知道如何使用 2 个不同的模型来执行此操作,但这意味着我必须创建一个无用的模型。如果我能弄清楚这部分,这个范围查询功能就很棒。

你可以试试这个:

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

不过这个post已经很老了..

我想指出以下几点

如果您要使用 selectRaw

->selectRaw('`users`.`id` as uid');

在这种情况下,它不会替换原来的 select,而是添加额外的列。据我所知,这没有记录在案。如果您想链接多个连接范围,这将非常有用。

此外,如果您不知道原始 select 语句,它可以是动态的。

此外,您可以 extend/override 默认 'newQuery' 方法,以更改使用范围时的默认行为

像这样

    public function newQuery($excludeDeleted = true): Builder
    {
        return parent::newQuery($excludeDeleted)->select('table_name.*');
    }

但是我建议使用 selectRaw 而不是更改 newQuery() 的默认行为,因为在某些情况下这可能会让您进入 trouble/conflicts。