如何在 laravel 中编写此查询?有啥建议么?

Posted

技术标签:

【中文标题】如何在 laravel 中编写此查询?有啥建议么?【英文标题】:How to write this query in laravel? Any Suggestions?如何在 laravel 中编写此查询?有什么建议么? 【发布时间】:2020-03-10 13:44:32 【问题描述】:

这是在 MY SQL 中运行良好的查询:

SELECT users.name FROM ((event_user INNER JOIN events ON event_user.event_id = events.id) INNER JOIN users ON event_user.user_id = users.id) where events.name like '%FEB%' or users.name like '%FEB%' or users.email like '%FEB%' or users.phone 比如'%FEB%'

这是我写的,当然行不通:

$data['search_data'] = EventUser::select('users.*')
        ->join
            ('users', 'event_user.user_id', '=', 'users.id')
        ->join
            ('events', 'event_user.event_id', '=', 'events.id')
        ->where
            ('events.name','like', "'$search'")
        ->orWhere
            ("users.id",'like', "'$search'")
        ->orWhere
            ("users.name",'like', "'$search'")
        ->orWhere
            ("users.phone",'like', "'$search'")
        ->orWhere
            ("users.email",'like', "'$search'")
        ->orWhere
            ("users.password",'like', "'$search'")
        ->orWhere
            ("users.work_location",'like', "'$search'")
        ->orWhere
            ("users.profession",'like', "'$search'")
        ->orWhere
            ("users.designation",'like', "'$search'")
        ->orWhere
            ("users.committee",'like', "'$search'")
        ->orWhere
            ("users.role",'like', "'$search'")
        ->orWhere
            ("users.bio",'like', "'$search'")
        ->paginate(10);

好的,在大家的帮助下。 我有解决办法。谢谢大家。

     $data['search_data'] = EventUser::select('users.*', 'events.name as e_name')
        ->join('users', 'event_user.user_id', '=', 'users.id')
        ->join('events', 'event_user.event_id', '=', 'events.id')
        ->where('events.name', 'like', '%'.$search.'%')
                ->orWhere('users.id', 'like', '%'.$search.'%')
                ->orWhere('users.name', 'like', '%'.$search.'%')
                ->orWhere('users.phone', 'like', '%'.$search.'%')
                ->orWhere('users.email', 'like', '%'.$search.'%')
                ->orWhere('users.password', 'like', '%'.$search.'%')
                ->orWhere('users.work_location', 'like', '%'.$search.'%')
                ->orWhere('users.profession', 'like', '%'.$search.'%')
                ->orWhere('users.designation', 'like', '%'.$search.'%')
                ->orWhere('users.committee', 'like', '%'.$search.'%')
                ->orWhere('users.role', 'like', '%'.$search.'%')
                ->orWhere('users.bio', 'like', '%'.$search.'%')
            ->distinct()
        ->paginate(10);

但这仍然返回重复的结果。

【问题讨论】:

不要双引号你的变量。它会将这些引号添加到您正在搜索的字符串中。 什么不起作用?您是否收到错误消息或只是不是您预期的输出? like 未正确使用,但在您提到的答案中,在指向 like 的正确语法后仍然无法正常工作,因此尚不清楚出了什么问题。 它没有返回任何结果。因为 SQL 查询在 MY SQL 中返回结果 【参考方案1】:

你需要像这样连接$search%

->where('events.name','like', '%'.$search.'%')

【讨论】:

它没有返回任何结果。因为 SQL 查询在 MY SQL 中返回结果 @Ehtasham 你能发布一些mysql将返回的结果吗? @Ehtasham 看起来不错。确保 EventUser 是表 event_user 的模型。可以用->toSql()代替->paginate(10),在mysql中查看原始sql。 谢谢@TsaiKoga,这很有帮助。但即使是这个也返回重复的结果。 @Ehtasham distinct() 将影响您选择的每一列,重复结果的列是否都相同?【参考方案2】:

嗯,这是一个很长的查询,我想你可以测试一下:

$data['search_data'] = EventUser::select('users.*')
    ->join('users', 'event_user.user_id', '=', 'users.id')
    ->join('events', 'event_user.event_id', '=', 'events.id')
    ->where('events.name', 'like', '%'.$search.'%')
    ->where(function ($query) use ($search) 
        $query->where('title', 'LIKE', '%'.$search.'%')
        ->orWhere('users.id', 'LIKE', '%'.$search.'%')
        ->orWhere('users.name', 'LIKE', '%'.$search.'%')
        ->orWhere('users.phone', 'LIKE', '%'.$search.'%')
        ->orWhere('users.email', 'LIKE', '%'.$search.'%')
        ->orWhere('users.password', 'LIKE', '%'.$search.'%')
        ->orWhere('users.work_location', 'LIKE', '%'.$search.'%')
        ->orWhere('users.profession', 'LIKE', '%'.$search.'%')
        ->orWhere('users.designation', 'LIKE', '%'.$search.'%')
        ->orWhere('users.committee', 'LIKE', '%'.$search.'%')
        ->orWhere('users.role', 'LIKE', '%'.$search.'%')
        ->orWhere('users.bio', 'LIKE', '%'.$search.'%')
   )
   ->paginate(10);

希望对您有所帮助。让我们知道它是否有效!

【讨论】:

还是一样不返回任何结果 你好@Ehtasham,您是否更改了变量以适应您的项目?代替->paginate(10);,替换为->get(); 并将查询插入dd(); 并检查结果。 无连接查询工作正常。我得到的是错误在于加入。

以上是关于如何在 laravel 中编写此查询?有啥建议么?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 laravel 8 中编写子查询?

laravel 查询生成器查询有啥问题?

如何在 Laravel 5.1 中编写这个(左连接、子查询)?

用python构建微博网站?有啥建议么

如何将此查询从SQL(mysql)转换为Eloquent(Laravel)

如何在 Laravel 查询中使用多个 OR、AND 条件