【问题标题】:Laravel BelongsToMany with array of ids as an attribute instead of individual idLaravel BelongsToMany 以 id 数组作为属性而不是单个 id
【发布时间】: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');
}

目前没有工作。

  1. 我想知道是否可以让它在哪里工作,如果它读取 school_ids,它将把它转换为一个数组,调用 User::schools() 会给我一个 School 模型的集合?
  2. 如果#1可以做到,不知能否在laravel nova上实现(?)

【问题讨论】:

  • 将数组作为字符串存储在school_ids 中不是执行belongsToMany() 的正确方法;这需要一个pivot 表(school_user),带有school_iduser_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


【解决方案1】:

所以为了让我的生活更轻松,我决定创建一个数据透视表来链接学校和用户。

【讨论】:

    【解决方案2】:

    按关系我猜你不能,但你可以做这样的事情

    public function schools() {
      return Schools::whereIn('id',$this->school_ids)->get(); // Will return collection of Schools object 
    }
    

    【讨论】:

    • 是的,这是可以做到的,虽然当我在 laravel nova 上实现它时我将无法使用它,因为它是特定领域的。谢谢!
    猜你喜欢
    • 2021-10-04
    • 2022-08-03
    • 2021-07-28
    • 1970-01-01
    • 2018-10-21
    • 1970-01-01
    • 1970-01-01
    • 2015-04-26
    • 1970-01-01
    相关资源
    最近更新 更多