【问题标题】:How to get data when foreign key value store as array?外键值存储为数组时如何获取数据?
【发布时间】:2021-09-22 06:04:59
【问题描述】:

我有两个表,其中基表 userid 列作为主键,子表 user_report 有一个外键 user_id

我知道这不是将值存储为数组的好方法。但我只想知道目前的情况。

表 1:user

  • id
  • name
  • email

表2:user_report

  • id
  • user_id(值存储为数组,如[1,2,4]

现在的问题是如何通过单个查询轻松检索用户报告数据和用户数据。

到目前为止,我已经尝试如下。

$report = UserReport::find( $id );
$users = User::whereIn( 'id', $report ->user_id )->get()->toArray();

我希望有人可以帮助解决这个问题。任何建议将不胜感激。

【问题讨论】:

  • 你不应该那样做。规范化您的表user_reports,其中user_id 只有一个ID,但您宁愿拥有多行。这样你就可以使用 Laravel 关系 - 更流畅,更容易使用。
  • @Qirel 在问题中他说他知道这不是处理事情的正确方式。但我同意最好改变数据库结构并建立关系
  • @Qirel 感谢您的建议,我知道但只是想知道如何实现这种方式。
  • 您不能将其简化为单个查询而不使其过于复杂,因为您需要先检索它并对其进行拆分。正如我之前所说,使用规范化表,您可以在单个查询中完成。
  • @Qirel 是的,我只是想知道这是否可能。我现在得到了答案。谢谢

标签: php laravel eloquent laravel-queue


【解决方案1】:

您可以将 user_id 属性分解为一个数组:

$users = User::whereIn( 'id', explode(',',$report ->user_id) )->get()->toArray();

【讨论】:

  • 在我的问题中,我尝试了两个查询,它工作正常。但是如何通过单个查询改进上述查询
  • 如果您使用逗号分隔的 ID,则不应在一个查询中执行此操作。这就是为什么你应该使用关系的原因之一。好吧,你可以,但这将意味着一个缓慢而复杂的查询。
  • 谢谢。所以这个数据库结构是不可能得出结论的。
  • 有时最好有多个查询。 Eloquent 也确实会加载一些包含多个查询的关系,只是因为它更高效。
【解决方案2】:

在您的项目中尝试这种解决方案。因为外键关系在一条记录中没有多个值,如 [1,2,3...]。

表 1:用户

id
name
email

表 2:报告

id,
detail

表 3:用户报告

id
report_id
user_id

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 2016-08-20
    • 1970-01-01
    • 2022-08-05
    • 2022-11-16
    • 1970-01-01
    相关资源
    最近更新 更多