Laravel 5.0 使用带有联接的查询生成器的查询
Laravel 5.0 Queries Using Query Builder with Joins
我有一个 MySQL 查询,我想在 Laravel 5 的查询生成器格式中实现它。
我有表格 Items 和 FaceOff。在我的 Laravel 控制器中,我引用了 namespace/Items 和 namespace/FaceOff 模型。
查询:
select i1.id as id1, i2.id as id2
from items i1
join
items i2
left join
faceoff f
on (f.wonid = i1.id and f.lostid = i2.id and userid = '1') or
(f.wonid = i2.id and f.lostid = i1.id and userid = '1')
where f.wonid is null and i1.id <> i2.id
order by rand()
limit 1;
我遇到的问题是如何加入嵌套查询,以及如何为表使用别名。例如,这个简单的查询:
$items = Items::select('id as id1')
我可以为列名设置别名,但不知道如何为整个查询的结果设置别名。
简而言之,我正在尝试抓取 2 个在 "head to head" 对决中未遇到的随机物品。将其视为配对两个竞争对手——每个竞争对手只应支付给另一个竞争对手一次。所以,查询应该return ID1和ID2。这些应该是不同的 ID,并且彼此之间没有赢或输。
问题:
有人可以帮我把它翻译成 Laravel 的查询生成器格式吗?我怀疑我必须使用 DB::raw 表达式。
我尝试使用 DB::Raw 表达式但失败了,它给出了关于未包含数据库模型的错误。我也很犹豫是否要打开系统进行 SQL 注入,无论如何,都在努力解决连接问题。
在此先感谢迷路的人。
您的代码中唯一棘手的部分是不寻常的 join
。其他部分只是简单的Query\Builder
方法:
// you could use model query, but it makes little sense in this case
// Items::from('items as i1')->join...
DB::table('items as i1')
->join( DB::raw('items as i2 left join faceoff as f'), function ($j) {
$j->on('f.wonid', '=', 'i1.id')
->on('f.lostid', '=', 'i2.id')
->where('userid', '=', 1)
->orOn('f.wonid', '=', 'i2.id')
->on('f.lostid', '=', 'i1.id')
->where('userid', '=', 1);
})->whereNull('f.wonid')
->where('i1.id', '<>', 'i2.id')
->orderByRaw('rand()')
->take(1)
->select('i1.id as id1', 'i2.id as id2')
->get();
我有一个 MySQL 查询,我想在 Laravel 5 的查询生成器格式中实现它。
我有表格 Items 和 FaceOff。在我的 Laravel 控制器中,我引用了 namespace/Items 和 namespace/FaceOff 模型。
查询:
select i1.id as id1, i2.id as id2
from items i1
join
items i2
left join
faceoff f
on (f.wonid = i1.id and f.lostid = i2.id and userid = '1') or
(f.wonid = i2.id and f.lostid = i1.id and userid = '1')
where f.wonid is null and i1.id <> i2.id
order by rand()
limit 1;
我遇到的问题是如何加入嵌套查询,以及如何为表使用别名。例如,这个简单的查询:
$items = Items::select('id as id1')
我可以为列名设置别名,但不知道如何为整个查询的结果设置别名。
简而言之,我正在尝试抓取 2 个在 "head to head" 对决中未遇到的随机物品。将其视为配对两个竞争对手——每个竞争对手只应支付给另一个竞争对手一次。所以,查询应该return ID1和ID2。这些应该是不同的 ID,并且彼此之间没有赢或输。
问题:
有人可以帮我把它翻译成 Laravel 的查询生成器格式吗?我怀疑我必须使用 DB::raw 表达式。
我尝试使用 DB::Raw 表达式但失败了,它给出了关于未包含数据库模型的错误。我也很犹豫是否要打开系统进行 SQL 注入,无论如何,都在努力解决连接问题。
在此先感谢迷路的人。
您的代码中唯一棘手的部分是不寻常的 join
。其他部分只是简单的Query\Builder
方法:
// you could use model query, but it makes little sense in this case
// Items::from('items as i1')->join...
DB::table('items as i1')
->join( DB::raw('items as i2 left join faceoff as f'), function ($j) {
$j->on('f.wonid', '=', 'i1.id')
->on('f.lostid', '=', 'i2.id')
->where('userid', '=', 1)
->orOn('f.wonid', '=', 'i2.id')
->on('f.lostid', '=', 'i1.id')
->where('userid', '=', 1);
})->whereNull('f.wonid')
->where('i1.id', '<>', 'i2.id')
->orderByRaw('rand()')
->take(1)
->select('i1.id as id1', 'i2.id as id2')
->get();