从 Laravel 的 belongsToMany 关系中选择自定义列

Posted

技术标签:

【中文标题】从 Laravel 的 belongsToMany 关系中选择自定义列【英文标题】:Select custom columns from Laravel belongsToMany relation 【发布时间】:2014-07-05 18:31:21 【问题描述】:

我试图只选择多对多关系users 上的特定属性,就像一对一一样。但是在belongsToMany() 上使用select() 似乎被忽略了,我仍然得到所有用户属性。

class Computer extends Eloquent 
    public function users() 
        return $this->belongsToMany("User")->select("email");
    

    public function admin() 
        return $this->hasOne("User")->select("email");
    


Computer::with("users")->get();

有没有办法只过滤来自belongsToMany() 相关实体的指定列?

【问题讨论】:

就是这样,你有什么版本的? 我目前正在运行 4.1 那么users 关系的输出是什么? 它返回所有用户属性,而不仅仅是select() 所需的那些。 select() 中定义的任何字段都只是在查询检索相关实体之前,例如 select email, users.* ... 好吧,你是对的。我在经过调整的belongsToMany 上进行了测试,没有这样的问题。将该调整作为 PR 发送,检查是否需要 github.com/laravel/framework/pull/4440 【参考方案1】:

根据 Taylor Otwell 的说法,目前不可能:https://github.com/laravel/laravel/issues/2679

我尝试在查询结束时使用lists('user.email'),但无法正常工作。

【讨论】:

【参考方案2】:

是的,你actually can。

Computer::with("users")->get(array('column_name1','column_name2',...));

如果您的数据透视表链接的两个表的列名相同,请务必小心。在这种情况下,您需要以点表示法指定表名,tableName.columnName。例如,如果用户和计算机都有一个列名id,你需要这样做:

Computer::with("users")->get(array('users.id','column_name2',...));

【讨论】:

这不起作用。 return $data_collect = DataCollect::whereCampaignId($campaignId) ->with('options') ->get(['title']);这只是返回标题,选项关系返回为空。当我取出 ['title'] 时,选项又回来了。【参考方案3】:
Computer::with(["users" => function($query)
$query->select('column1','column2','...');
])->get();

【讨论】:

您能否详细说明您的答案并解释其作用?

以上是关于从 Laravel 的 belongsToMany 关系中选择自定义列的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 关系查询加载 hasMany + BelongsToMany

检查 belongsToMany 关系是不是存在 - Laravel

Laravel 关系:hasManyThrough、belongsTo、belongsToMany

Laravel:如何编写关于 belongsToMany 关系的连接计数查询?

Laravel:保存/附加/同步自定义枢轴模型(belongsToMany)

Laravel 递归 whereHas on BelongsToMany 关系