Laravel 5 Eloquent scope连接并选择特定列

时间:2015-03-06 22:05:39

标签: laravel scope eloquent

我有一个Eloquent模型,在模型中我使用范围查询来进行连接。这一切都运行正常,但我想弄清楚范围查询中如何只从连接表中选择某些列。

这是我控制器中的方法。

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

这是模型中的范围查询

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

这样可行,但它会从帐户和用户返回所有列,但我只想要帐户中的所有列,而只需要来自用户的2列。

我试过了......

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

但是,这只返回用户的那两个字段,并忽略帐户中的列。我知道如何用2种不同的模型做到这一点,但这意味着我必须创建一个无用的模型。如果我可以解决这个问题,这个范围查询功能很棒。

2 个答案:

答案 0 :(得分:17)

你可以试试这个:

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

答案 1 :(得分:0)

但是这篇文章很老。.

我想指出以下几点

如果要使用selectRaw

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

在这种情况下,它将不会替换原始选择,而会添加其他列。据我所知,这是没有记载的。如果要链接多个联接作用域,这将非常有用。

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

此外,您可以扩展/覆盖默认的“ newQuery”方法,以更改使用范围时的默认行为

像这样

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

但是,我建议您使用selectRaw来更改newQuery()的默认行为,因为在某些情况下这可能会使您遇到麻烦/冲突。