【发布时间】:2021-05-11 18:26:18
【问题描述】:
我在 Laravel 中的模型有一个如下所示的 linked_ids 字符串字段:echo $model->linked_ids1,2,3,4,5
我想进行一个查询,让我在linked_ids 中获取所有具有给定ID 的记录。
目前我有:Model::where('linked_ids', 'LIKE', '%' . $model->id . '%');
但这比我想要的更多(如果例如:$model->id 是 3 => 选择:1,32,67)\
由于我不知道 id 的位置也不知道 id 的顺序,我该如何避免这种情况?我想在 eloquent 中做到这一点,但也可以使用 DB::raw() 之类的东西来运行 sql 查询。
【问题讨论】:
-
Model::whereIn('linked_ids', [1,2,3,4,5]);应该这样做 -
所以
linked_ids是一个包含ID 列表的varchar?这是一种糟糕的数据方法,您应该考虑将其规范化为适当的关系表 -
@krisgjika 你可以在 Laravel 中与同一模型建立关系:here is a valid example of a one to many relationship on the same model
-
我从来没有说过我因为数据的状态而责怪你;我以前采用过这种形式的代码,但就像我说的,考虑改变它。此外,您可以在同一张表之间进行数据透视;
model_links、modle_a_id、model_b_id、6, 1、6, 2、6, 3等。这样的 CSV 列查询起来非常困难且效率低下,正如您发现的那样当你想要3时检索 ID32。 -
听起来不错!我想了更多,您可以有点使用您的数据结构进行这项工作。假设您有模型
id: 6,链接 ID 为'1,2',此查询应该有效:Model::whereIn('id', explode(',', Model::find(6)->linked_ids'))->get();;您必须从数据库中获取记录,分解linked_ids并查询id。但重点仍然在于您无法有效地查询linked_ids。