关于Laravel的查询构建器的一些菜鸟问题。 我正在尝试翻译这个简单的SQL查询:
SELECT s.name, e.name, m.name
FROM sports as s, events as e, matches as m
WHERE s.name = 'Football'
体育 - >事件 - >匹配有1 - >关系
所以上面的选择查询使用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?
提前致谢!
答案 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)
在浪费了相当长的一段时间之后,我发现了:
解决问题的正确方法是:
$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();
我希望这能帮助别人,
再见。