gpt4 book ai didi

mysql - Laravel 5.0 查询使用带连接的查询构建器

转载 作者:太空宇宙 更新时间:2023-11-03 12:01:31 24 4
gpt4 key购买 nike

我有一个 MySQL 查询,我想用 Laravel 5 的查询生成器格式实现。

我有表 Items 和 FaceOff。在我的 Laravel Controller 中,我引用了 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 个未在“正面交锋”中相遇的元素。将其视为配对两个竞争对手——每个竞争对手只应支付给另一个竞争对手一次。因此,查询应返回 ID1 和 ID2。这些应该是不同的 ID,并且彼此之间没有赢或输。

问题:

有人可以帮我把它翻译成 Laravel 的查询生成器格式吗?我怀疑我必须使用 DB::raw 表达式。

我尝试使用 DB::Raw 表达式但失败了,它给出了关于未包含数据库模型的错误。我也对向 SQL 注入(inject)开放系统犹豫不决,无论如何,都在努力解决连接问题。

预先感谢迷路的人。

最佳答案

代码中唯一棘手的部分是不寻常的 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.0 查询使用带连接的查询构建器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28931193/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com