【发布时间】:2021-08-08 15:34:24
【问题描述】:
在 Laravel 中,我正在创建消息线程功能。我的架构如下所示:
MessageThreads 表
| column |
|---|
| id |
MessageThreadParticapants 表
| column |
|---|
| thread_id |
| user_id |
而我有MessageThread和MessageThreadParticapant的对应模型。在 MessageThread 模型中,我有以下关系:
public function users() {
return $this->hasMany(MessageThreadParticapant::class, 'thread_id', 'id');
}
这就是事情变得有趣的地方。如果我这样做:
MessageThread->users
我得到一个空的结果。但如果我这样做:
MessageThreadParticapant::where('thread_id', $same_thread_id)->get()
我得到了正确数量的结果。我在这里做错了什么?
更新
其中一个建议是“hasMany(Model, 'foreign_key', 'local_key')”不正确。更多的上下文,它没有通过我的单元测试。我正在测试这样的测试:
public function testUsers() {
$thread1 = MessageThread::factory()->create();
$thread2 = MessageThread::factory()->create();
$this->assertCount(0, $thread1->users);
$this->assertCount(0, $thread2->users);
$user1 = User::factory()->create();
$user2 = User::factory()->create();
$user3 = User::factory()->create();
$user4 = User::factory()->create();
MessageThreadParticapant::factory()->create([
'user_id' => $user1->id,
'thread_id' => $thread1->id
]);
MessageThreadParticapant::factory()->create([
'user_id' => $user2->id,
'thread_id' => $thread1->id
]);
MessageThreadParticapant::factory()->create([
'user_id' => $user2->id,
'thread_id' => $thread2->id
]);
MessageThreadParticapant::factory()->create([
'user_id' => $user3->id,
'thread_id' => $thread2->id
]);
MessageThreadParticapant::factory()->create([
'user_id' => $user4->id,
'thread_id' => $thread2->id
]);
//PASSES!!!!
$this->assertCount(2, MessageThreadParticapant::where('thread_id', $thread1->id)->get());
//FAILS!!!
$this->assertCount(2, $thread1->users);
$this->assertCount(3, $thread2->users);
}
在我的测试底部:
//PASSES!!!!
$this->assertCount(2, MessageThreadParticapant::where('thread_id', $thread1->id)->get());
//FAILS!!!
$this->assertCount(2, $thread1->users);
在其他测试中,$thread->users 可以正常工作以获取正确数量的用户。为什么这些会得到不同的结果?
【问题讨论】:
-
@sta 我更新了上面的回复。它可以在测试之外的生产环境中工作,但只会在测试中失败。
-
检查你的表引擎,好像你的测试服务器数据库引擎是 InnoDB 而你的生产表引擎是 MyISAM
-
你逆向工作吗?例如
messageThreads模型中的User关系。