是否可以从没有DB的多个表中进行选择:Raw?

时间:2015-11-24 11:09:15

标签: laravel

关于Laravel的查询构建器的一些菜鸟问题。 我正在尝试翻译这个简单的SQL查询:

SELECT s.name, e.name, m.name
FROM sports as s, events as e, matches as m
WHERE s.name = 'Football'

体育 - >事件 - >匹配有1 - >关系

  • Match有一个event_id外键
  • 活动有一个sport_id外键,
  • 体育是根。

所以上面的选择查询使用s.name ='Football'给出:

+----------+-------------+----------------------+
| name     | name        | name                 |
-------------------------------------------------
|Football  | World Cup   |  England vs Germany  |
|Football  | World Cup   |  Argentina vs France |
| ...      | ...         |  ...                 |
-------------------------------------------------

我想在Laravel Query Builder查询中翻译它,而不使用DB:Raw,我有点困惑,因为doc中显示的所有示例都以DB:table(blabla)开头,这似乎只接受1个表作为参数。 像

这样的东西
$events = DB::table('sports as s', 'events as e')
->select('s.name', 'e.name')
->where('s.name', '=', 'Football')
->get();

说e.name被认为是未知的。 我在这里读到了一些使用DB的答案:Raw或一些奇怪的连接。

那么......你们知道Laravel的任何查询生成器处理这些查询的优雅方式吗?或者我必须坚持使用DB:Raw?

提前致谢!

2 个答案:

答案 0 :(得分:2)

我相信你要做的就是在你的三张桌子之间创建一个联盟。

来自http://laravel.com/docs/5.1/queries#unions

$first = DB::table('users')
            ->whereNull('first_name');

$users = DB::table('users')
            ->whereNull('last_name')
            ->union($first)
            ->get();
  

unionAll方法也可用,并且具有相同的方法   签名为工会。

如果您想查询匹配表中的匹配项,则会使用联接,然后加入匹配项的匹配事件,例如,匹配匹配项= match_id = event_id。

答案 1 :(得分:2)

在浪费了相当长的一段时间之后,我发现了:

  • 在多个表而不是显式JOIN上使用SELECT WHERE被认为是一种不好的做法,主要是为了代码可读性。
  • 使用Laravel的查询生成器可能无法在不使用DB的情况下实现我想要的(糟糕的练习方式):raw
  • 解决问题的正确方法是:

    $events = DB::table('sports as s')
            ->join ('events as e', 'e.sport_id', '=' , 's.id')
            ->join ('matches as m', 'm.event_id', '=' , 'e.id')
            ->select('s.name as sname',
                        'e.name as ename',
                        'm.name as mname')
            ->get();
    

(至少工作正常)

  • 当字段名称相同时,必须对SELECT中的名称进行别名,或者您只为所有相同的名称获取一列(其中包含我失去了很多时间:))。

  • 我尝试过使用Yii框架和不良做法"工作正常以及连接方法:

     $query = (new \yii\db\Query())
     ->select(['sport_name' => 's.name','event_name' => 'e.name'])
     ->from(['s' => 'sports','e' => 'events'])
     ->where(['s.name' => 'Football'])
     ->all();
    

我希望这能帮助别人,

再见。