如何在Laravel关联模型的Accounts对象中获取group_id字段
问题描述
我用于获取数据的函数如下:
public function settings(){ $accounts = ScrapingTarget::with('accounts') // ->distinct() ->where('accounts.group_id',333) ->get(); }
我的ScrapingTargetModel中的关联方法如下:
public function accounts(){ return $this->hasMany(Accounts::class, 'id', 'account_id'); }
返回的数据结构如下,我想访问Accounts对象中的group_id字段,请问该如何实现?
[ { "id": 1, "account_id": 1, "accounts": [ { "group_id": 333 } ] } ]
解决方案
1. 先修正关联关系参数顺序
你的hasMany关联参数写反了,正确顺序是hasMany(关联模型, 外键, 主键),所以关联方法要改成:
public function accounts(){ return $this->hasMany(Accounts::class, 'account_id', 'id'); }
因为ScrapingTarget的主键是id,Accounts表中关联的外键是account_id,参数顺序错误会导致关联数据查询异常。
2. 访问group_id的几种实用方式
方式一:遍历集合访问
由于accounts是hasMany关联,返回的是集合,需要嵌套遍历:
foreach ($accounts as $scrapingTarget) { foreach ($scrapingTarget->accounts as $account) { $groupId = $account->group_id; // 这里可以用$groupId做后续操作 } }
方式二:单个关联场景下直接访问
如果每个ScrapingTarget只会关联一个Accounts,可以把关联改成hasOne,简化访问:
// 修改ScrapingTargetModel的关联方法 public function account(){ return $this->hasOne(Accounts::class, 'account_id', 'id'); } // 查询时调整关联名称并优化条件 $accounts = ScrapingTarget::with('account') ->whereHas('account', function($query) { $query->where('group_id', 333); }) ->get(); // 直接访问group_id foreach ($accounts as $scrapingTarget) { $groupId = $scrapingTarget->account->group_id; }
方式三:批量提取所有group_id
如果需要一次性获取所有关联的group_id,可以用集合的高阶方法:
$allGroupIds = $accounts->pluck('accounts.*.group_id')->flatten()->unique(); // $allGroupIds就是所有关联account的group_id集合
3. 优化查询条件写法
当前的where('accounts.group_id',333)容易出现歧义,建议改用whereHas约束关联模型条件:
$accounts = ScrapingTarget::with('accounts') ->whereHas('accounts', function($query) { $query->where('group_id', 333); }) ->get();
内容的提问来源于stack exchange,提问作者John Lloyd Detomal
相关产品推荐
相关产品推荐

