【发布时间】:2021-08-27 12:27:20
【问题描述】:
给定:
"users" table:
[{
id: 1,
school_ids: [1, 2, 3] // text type cast as array
}]
然后:
"schools" table:
[{
id: 1,
name: 'school 1",
},
{
id: 2,
name: 'school 2",
},
{
id: 3,
name: 'school 3",
}]
我目前在我的用户模型中有一个关系:
public function schools() {
return $this->belongsToMany(School::class, 'school_ids');
}
目前没有工作。
- 我想知道是否可以让它在哪里工作,如果它读取
school_ids,它将把它转换为一个数组,调用User::schools()会给我一个School模型的集合? - 如果#1可以做到,不知能否在laravel nova上实现(?)
【问题讨论】:
-
将数组作为字符串存储在
school_ids中不是执行belongsToMany()的正确方法;这需要一个pivot表(school_user),带有school_id和user_id。考虑规范化您的数据库并相应地迁移此信息。 -
@TimLewis 既然您提到了它,我确实同意该建议,因为如果您从学校查询,很难知道哪个用户在该学校注册。
-
完全正确;如果你试图查询哪个用户有学校 1,例如,它会是
SELECT * FROM users WHERE school_ids LIKE '%1%';,它会找到学校 1、11、12、13、14 等......这有一些方法,比如FIND_IN_SET等,但如果它们在数据透视表中分开,则要容易得多。SELECT user_id FROM school_user WHERE school_id = 1将为您提供与学校 1 相关联的用户列表,而不是 11、12 等。然后您可以加入/子查询并获取实际的users行???? -
在大多数情况下,是的,
LIKE是一个相当缓慢的操作。join(),以及使用=或IN()检查 id 的速度要快得多,尤其是在正确索引的情况下。 -
@IamL 请在下面发布您选择的解决方案作为答案并将其标记为已接受的答案,而不是将其编辑到问题中以试图通过文字“关闭”问题。 “关闭”是指 Stack Exchange 网站上的特定内容。请参阅help center 了解更多信息。
标签: laravel relationship has-and-belongs-to-many laravel-nova