查询多个位置和同一行

Query with multiple where and same row

我想显示 学生 的数据,该学生具有多个角色(例如:英俊和聪明),如果学生不具备这两个角色或只有其中之一,则学生必须同时具备这两个角色然后字符 DONT SHOW.

我试过使用这个代码,但是所有包含字符(帅气和聪明)的数据都出现了

示例:

$data = DB::table('student')->whereIn('characters', ['handsome','smart'])->get();

您可以将 where 约束链接在一起,也可以向查询中添加 or 子句。 orWhere 方法接受与 where 方法相同的参数:

$users = DB::table('student')
                    ->where('characters', 'handsome')
                    ->orWhere('characters', 'smart')
                    ->get();

针对此要求的工作原始 MySQL 查询类似于:

SELECT s1.*
FROM student s1
INNER JOIN
(
    SELECT id
    FROM student
    WHERE character IN ('handsome', 'smart')
    GROUP BY id
    HAVING COUNT(DISTINCT character) = 2
) s2
    ON s1.id = s2.id;

我们可以尝试编写如下Laravel代码:

$characters = DB::table('student')
    ->select('id')
    ->whereIn('characters', ['handsome','smart'])
    ->groupBy('id')
    ->havingRaw('COUNT(DISTINCT character) = 2');

$matches = DB::table('student s1')
    ->joinSub($characters, 's2', function ($join) {
        $join->on('s1.id', '=', 's2.id');
    })
->get();

此答案假定 student table 的主键列称为 id。如果它被称为其他名称,请更新我的代码片段以匹配它。

将此 where 子句放入您的查询中,如下所示:

$student = \DB::table('student')
->whereExists(function ($query) {
$query->orWhere('characters', 'handsome')
->orWhere('characters', 'smart');
 })->get();