【问题标题】:Laravel 5 Eloquent scope join and select specific columnsLaravel 5 Eloquent 范围连接并选择特定列
【发布时间】:2015-05-08 15:07:10
【问题描述】:

我有一个 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 个不同的模型来做到这一点,但这意味着我必须创建一个无用的模型。如果我能弄清楚这部分,这个范围查询功能就很棒。

【问题讨论】:

    标签: laravel scope eloquent


    【解决方案1】:

    但是这篇文章很老了..

    我确实想指出以下几点

    如果你会使用 selectRaw

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

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

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

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

    喜欢这个

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

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

    【讨论】:

      【解决方案2】:

      你可以试试这个:

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

      【讨论】:

        猜你喜欢
        • 2017-02-22
        • 2016-12-16
        • 2019-06-15
        • 1970-01-01
        • 2018-01-08
        • 2016-11-05
        • 2018-09-10
        • 1970-01-01
        • 2015-07-12
        相关资源
        最近更新 更多