为啥 laravel 返回一个空数组来表示一个有很多关系?
Posted
技术标签:
【中文标题】为啥 laravel 返回一个空数组来表示一个有很多关系?【英文标题】:Why laravel returns an empty array for a has many relationship?为什么 laravel 返回一个空数组来表示一个有很多关系? 【发布时间】:2021-08-18 01:11:03 【问题描述】:我正在使用 jenssegers/laravel-mongodb,我的架构如下所示
取票:
"_id": ObjectId("5f32d9bb486e94459b6531c3"),
"subject": "\"URGENT\" Non-Compliance In (Eastern Region)",
"content": "abc",
"user_team": "5f044199e40dfe4847056785",
"team_ids": [
"5f3012bbb7c2bc422e4da5a2"
],
"organization_id": "5f74359c7dcc8f6fbb2b47e2"
团队收藏:
"_id":ObjectId("5f3012bbb7c2bc422e4da5a2"),
"name": "Medical Maintenance",
"createTickets": true
票证模型中的关系:
public function teams()
return $this->HasMany('App\Team', 'team_ids');
团队模型中的关系:
public function ticket()
return $this->belongsTo('App\Ticket');
我在获取团队关系数据时遇到问题。它返回一个空数组。
Laravel 版本是 6.2 jenssegers/mongodb 版本是 3.6
【问题讨论】:
我不确定,但你试过return $this->HasMany('App\Team', 'team_ids', '_id');
你定义的关系完全错误! Eloquent 如何通过team_ids
查找票证,该票证是多个并定义在一个数组结构中?
@Jayant 是的,我试过但还是空的
【参考方案1】:
在 hasMany 的上下文中,您处理外键的方法是错误的。取而代之的是一个名为 team_id 的列应该在工单上,然后您可以执行以下操作。
public function teams()
return $this->HasMany('App\Team', 'team_id');
如果您的票看起来像这样,这会起作用。
"_id": ObjectId("5f32d9bb486e94459b6531c3"),
"subject": "\"URGENT\" Non-Compliance In (Eastern Region)",
"content": "abc",
"user_team": "5f044199e40dfe4847056785",
"team_id":"5f3012bbb7c2bc422e4da5a2"
"organization_id": "5f74359c7dcc8f6fbb2b47e2"
相反,看起来您实际上是在做多对多,因为一个团队可以有很多票并反过来。这可以这样定义,这可能会将数据添加到两个模型中,但我不是 Laravel
中的 Mongodb
的专家。
public function teams()
return $this->belongsToMany(
Team::class, null, 'ticket_ids', 'team_ids'
);
你可以在documentation找到所有这些。
【讨论】:
我有超过 100 万张门票,如果我将ticket_id 存储在团队集合中,那么它将是一个巨大的团队单一文档,我不认为这是更好的方法,你说什么?跨度> 两者都一样吗?但请阅读票证的最后部分。 不,我有数百万张票,但团队很少像 100 或 200 人 “票的最后部分”是什么意思? 我回答的最后一部分,您可以使用 belongsToMany 方法。这就是您设计它的方式,并且应该可以工作。其次,我永远不会担心外键占用太多空间。除非它们是不必要的。【参考方案2】:您可以指定外键和本地键。
例子:
public function teams()
$this->hasMany('App\Team', 'team_ids', '_id')
【讨论】:
我指定但它仍然返回一个 emtpy以上是关于为啥 laravel 返回一个空数组来表示一个有很多关系?的主要内容,如果未能解决你的问题,请参考以下文章