我正在try 使用拉威尔的hasOne(Model::class)->ofMany('relationship'),但我也想额外过滤考虑过的结果.

更详细地说,我的问题:

我有这两个简化的表格,我在所见即所得风格的创作工具中使用:

文件:id (PK),...

文档修订表: id (PK),document_id (FK),revision_id,is_autosave,...

在修订表中,组合document_id, revision_id, is_autosave是唯一的,这意味着对于自动保存的修订和手动保存的修订,文档可以具有相同的Revision_id.

我正在try 使用以下代码将最新手动保存的修订与文档模型相关联:

public function mainRevision() {
   return $this->hasOne(DocumentRevision::class)
      ->where('autosave', false)
      ->ofMany('revision_id', 'max');
}

我可以拨打上面的电话,比如Documents::with('mainRevision')->where(...)->get(). 其目的是为所有匹配的文档行紧急加载最新的手动修订,并且仅加载最新的手动修订.

但是,这会生成以下查询:

select
    `document_revisions`.*
from
    `document_revisions` inner join (
        select
            max(`document_revisions`.`id`) as `id_aggregate`,
            min(`document_revisions`.`revision_id`) as `revision_id_aggregate`,
            `document_revisions`.`document_id`
        from
            `document_revisions`
                inner join (
                    select max(`document_revisions`.`revision_id`) as `revision_id_aggregate`,`document_revisions`.`document_id`
                    from `document_revisions` 
                    where `document_revisions`.`document_id` in (`<list of matched ids from the 1st query>`)
                group by
                    `document_revisions`.`document_id`
            ) as `mainVersion`
            on `mainVersion`.`revision_id_aggregate` = `document_revisions`.`revision_id` and `mainVersion`.`document_id` = `document_revisions`.`document_id`
        group by `document_revisions`.`document_id`) as `mainVersion` 
    on `mainVersion`.`id_aggregate` = `document_revisions`.`id`
        and `mainVersion`.`revision_id_aggregate` = `document_revisions`.`revision_id`
        and `mainVersion`.`document_id` = `document_revisions`.`document_id`
where
    `autosave` = 0

虽然我在这里看到了意图,但有一个问题,那就是where autosave=0是在连接表之外添加的.这会导致这样一种情况,即如果最新版本id恰好仅对应于自动保存,则不会拾取它.

理想情况下,我希望查询如下:

select
    `document_revisions`.*
from
    `document_revisions` inner join (
        select
            max(`document_revisions`.`id`) as `id_aggregate`,
            min(`document_revisions`.`revision_id`) as `revision_id_aggregate`,
            `document_revisions`.`document_id`
        from
            `document_revisions`
                inner join (
                    select max(`document_revisions`.`revision_id`) as `revision_id_aggregate`,`document_revisions`.`document_id`
                    from `document_revisions` 
                    where `autosave` = 0 --<<----------- change here
                     and `document_revisions`.`document_id` in (`<list of matched ids from the 1st query>`) 
                group by
                    `document_revisions`.`document_id`
            ) as `mainVersion`
            on `mainVersion`.`revision_id_aggregate` = `document_revisions`.`revision_id` and `mainVersion`.`document_id` = `document_revisions`.`document_id`
        group by `document_revisions`.`document_id`) as `mainVersion` 
    on `mainVersion`.`id_aggregate` = `document_revisions`.`id`
        and `mainVersion`.`revision_id_aggregate` = `document_revisions`.`revision_id`
        and `mainVersion`.`document_id` = `document_revisions`.`document_id`

有人知道这是否可能吗?

推荐答案

在确定最新修订的子查询中应用autosave = 0条件,try 执行以下操作.以下是修订后的代码

public function mainRevision() {
    return $this->hasOne(DocumentRevision::class)
        ->selectRaw('document_revisions.*, max(document_revisions.revision_id) as max_revision_id')
        ->where('autosave', false)
        ->groupBy('document_revisions.document_id')
        ->orderBy('max_revision_id', 'desc');
}

Php相关问答推荐

PHP DOMDocument忽略第一个表S结束标记

照明\Support\Collection::Filter():参数#1($Callback)的类型必须为?可调用、已给定数组、已调用

MySQLi是否在事务错误时删除保存点(并且仅删除保存点)?

创建一个新的可变产品及其属性以用于WooCommerce中的变体

基于不用于变体的产品属性隐藏多个WooCommerce发货方式

WooCommerce我的帐户:从帖子作者处获取自定义帖子类型帖子ID

添加并显示单价字段到WooCommerce产品变化

删除了数组中的值,而不是多个数组

使用随机生成器在MYSQL中创建唯一ID-定义一个数组来存储已知ID是否安全

如何在WordPress REST API中判断应用程序密码

PHP Match如何准确判断条件?

如何在PHP中根据会话将用户重定向到不同的页面?

随机显示WordPress快捷代码功能时出现问题

使用简码在 WooCommerce 我的帐户中显示一些用户数据

Shopware 6 插件:如何删除布尔配置并将其迁移到多选配置

有没有办法像引用枚举一样引用注册表中的对象?

使用帖子 ID 更新 wp 帖子

从 XAMPP 运行 shell 脚本时,意外标记(附近出现语法错误

注册命名空间后如何获取xml node 值?

使用 OOP PHP 创建动态 WHERE 子句.如何实现 BETWEEN 运算符?