Laravel 5雄辩地在哪里

时间:2015-03-19 17:15:07

标签: php mysql laravel eloquent laravel-5

希望有人可以帮助我,我需要在数据库中搜索类别为id = x的项目

示例表项 id,猫,名字等...... 猫=' 1,19'或者只是' 19'或者可能是' 1,9'

因此,对于此示例,我需要搜索具有9

的猫的项目

我试过这个但是当我搜索9时它也显示了19

$items = Items::where(function($query)use($cat) {
    $query->where('cats', 'like', '%,'.$cat->id.'%');
    $query->orWhere('cats', 'like', '%'.$cat->id.',%');
    $query->orWhere('cats', 'like', '%'.$cat->id.'%');
    })->orderBy('updated_at', 'DSC')->get();

我也尝试了一些东西

$items = Items::whereIn(explode(',', 'cats'), $cat->id)->get(); 

但它不起作用

感谢任何帮助,以找到最简单和最短暂的方式来做到这一点,问候

2 个答案:

答案 0 :(得分:1)

很难理解你想要达到的目标,但我会尝试。首先,@ subicus提到最好的方法是在不需要担心这些事情时创建数据透视表。

但是,如果在由逗号分隔的列中包含id列表,则解决方案不会存储

之类的值
1,2,3

但始终在开头和结尾添加,,所以应该是这种情况:

,1,2,3,

这样,如果您在表,19,2,3,中并且想要搜索值9,则应该使用查找,9,字符串,例如:

$id = 9; 
$items = Items::where('column', LIKE '%,'.$id.',%')->get();

现在对于上面的字符串,不会找到任何记录,但如果您有,9,2,3,或只有,9,,则会找到所需的记录。

答案 1 :(得分:0)

假设您正在使用MySQL,您可以使用FIND_IN_SET函数。

$items = Items::whereRaw("FIND_IN_SET(".$cat->id.", cats)")->orderBy('updated_at', 'DESC')->get();

请注意,这不会使用cats列上定义的任何索引。在一个字段中存储像数据一样的数组通常是一个很大的危险信号。你现在可以通过规范化来获益,而不是试图解决当前的设计问题。