首页 > 解决方案 > 在 Laravel 中使用 ORM 在 SQL 中有 vs. Where

问题描述

我认为我的问题与 SQL 相关,而不是与 Laravel 或其 ORM 相关,但我在 Laravel 中编程时遇到了问题,所以这就是我在问题中标记它的原因。

我的问题如下,我有以下模型(对不起西班牙语):

在此处输入图像描述

所以我想制作一个用户可以下注的表格。基本上,这种形式将从 pronosticos 表中获取数据,如下所示:

$juegos = Juego::where('jornada', $jor)
                 -> orderBy('expira')
                 -> get();

这产生了我想要的模型集合,我可以对其进行迭代以显示给定 jornada(周)的所有游戏。

现在,如果用户已经下注,我还想通过查询带来用户下注的分数值,所以我想我可以使用类似的东西:

$juegos = Juego::where('jornada', $jor)
                  -> leftJoin('pronosticos', 'juegos.id', '=', 'pronosticos.juego_id')
                  -> addSelect(['pronosticos.user_id', 'juegos.id', 'expira', 'visitante', 'local', 'diferencia'])
                  -> having('pronosticos.user_id', $uid)
                  -> orderBy('expira')
                  -> get();

现在,问题是,它带来了一个空集,这很明显,如果用户下注,它会起作用,但如果他没有下注,它会过滤掉所有东西,给出空集。

所以我想我不清楚如何使拥有或在哪里正常工作。也许我想要的leftJoin不是对pronosticos表做一个,而是从pronosticos已经用 where 子句过滤的表中做一个。

也许我做错了一切,应该对子选择进行 leftJoin 吗?如果是这样,我不知道该怎么做。

或者,也许我的期望超出了 SQL 所能做的范围,我可能会返回两个不同的集合,并在应用程序中处理它们?

编辑 这是我想在 Laravel 的 ORM 中表达的查询:

SELECT * from juegos
    LEFT JOIN (SELECT * FROM pronosticos WHERE user_id=1) AS p 
    ON p.juego_id = juegos.id 
    WHERE jornada = 2 ORDER BY expira

标签: sqllaravel-5eloquent

解决方案


推荐阅读