Laravel,在 eloquent 查询中搜索完全相同的子字符串

Laravel, search exact same substring in eloquent query

我有一个table这样的

老师Table

我想要做的是获取包含主题 1(或任何其他数字,如 7,8 等)

的行

这是我在我的控制器中尝试过的。

public function allTeachers($sub_id) //receiving $sub_id(to be searched)
  {
        $teachers_all=Teacher::where('subjects','like','%'.','.$sub_id.'%')->latest()->paginate(50);
        dd($teachers_all);
    }

这里的问题是,我得到的所有包含主题的行都是“1”,例如如果它是“3,11,22”或“41,5”,它会被选中。 但我想要实现的是它应该只 return 其中主题字符串包含 '1' 后跟 ',' 或 '1,2,44, 31,23'等 我正在使用 laravel,希望我把问题说清楚了。

您问题的解决方案是使用 find_in_setconcat 填充一些缺失的逗号,然后搜索值:

Teacher::whereRaw('find_in_set("' . $sub_id . '", subjects) <> 0')
    ->latest()
    ->paginate(50);

Teacher::whereRaw('concat(",", colors, ",") like "%,' . $sub_id . ',%"')
    ->latest()
    ->paginate(50);

也就是说,@bromeer 的评论在任何情况下都是正确的。 MySQL 不围绕字段中的 comma-separated 值。上面显示的两个示例都不是理想的解决方案。你应该多研究一下人际关系。


我建议在您的案例中使用 many-to-many 关系。为此,创建一个名为 teacher_subject 的枢轴 table 并将关系添加到您的 Teacher 模型:

public function subjects()
{
    return $this->belongsToMany(Subject::class);
}

要查找教授特定科目的教师,请使用 whereHas,如下所示:

Teacher::whereHas('subjects', function (Builder $query) use ($sub_id) {
    $query->where('id', $sub_id);
})->latest()->paginate(50);