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。
我有一个 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。