首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >hasManyThrough关系的中间模型上的withTrashed

hasManyThrough关系的中间模型上的withTrashed
EN

Stack Overflow用户
提问于 2019-03-01 17:29:50
回答 2查看 213关注 0票数 2

我有3个相关的类,像这样:

代码语言:javascript
运行
复制
Exhibitor
'- Bills
   '- Tickets

Bill和Tickets都使用SoftDeletes特性,在Exhibitor类上,我有这样的关系:

代码语言:javascript
运行
复制
public function tickets()
{
    return $this->hasManyThrough(Ticket::class, Bill::class);
}

我需要获取所有票据,包括已删除的(withTrashed),但这也需要包括所有已删除的票据。问题是,withTrashed只适用于Tickets模型,而不适用于Bill。

此查询

代码语言:javascript
运行
复制
    $tickets = exhibitor()->tickets()->withTrashed()
        ->where('bills.updated_at', '>=', Carbon::parse($since))
        ->orderBy('tickets.id')
        ->get();

生成此SQL

代码语言:javascript
运行
复制
select `tickets`.*, `bills`.`exhibitor_id` from `tickets`
inner join `bills` on `bills`.`id` = `tickets`.`bill_id`
where `bills`.`deleted_at` is null 
and `bills`.`exhibitor_id` = ?
and `bills`.`updated_at` >= ?
order by `tickets`.`id` asc

然而,我应该需要这个不带“SQL.SQLIS null”的bills,如下所示:

代码语言:javascript
运行
复制
select `tickets`.*, `bills`.`exhibitor_id` from `tickets`
inner join `bills` on `bills`.`id` = `tickets`.`bill_id`
where `bills`.`exhibitor_id` = ?
and `bills`.`updated_at` >= ?
order by `tickets`.`id` asc

但是我没有看到可以为Bill模型设置withTrashed()的任何选项。我认为应该可以在hasManyThrough方法上设置回调查询,但根据API不支持这一点。这看起来很简单,我感觉我忽略了一些东西,但我找不到它……

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-01 17:43:15

目前这是不可能的:https://github.com/laravel/framework/issues/23039

如果您不介意安装一个外部包,您可以使用我创建的这个包:https://github.com/staudenmeir/eloquent-has-many-deep

代码语言:javascript
运行
复制
class Exhibitor extends Model
{
    use \Staudenmeir\EloquentHasManyDeep\HasRelationships;

    public function tickets()
    {
        return $this->hasManyDeep(Ticket::class, [Bill::class])
            ->withTrashed('bills.deleted_at');
    }
}
票数 4
EN

Stack Overflow用户

发布于 2019-03-01 17:41:45

我将在tickets模型上定义一个作用域,因为查询变得有点复杂。

代码语言:javascript
运行
复制
public function scopeBillsSince($query, $since)
    return $query->whereHas('bills', function ($query2) use ($since) {
        return $query2->withThrashed()->where('updated_at', '>=', Carbon::parse($since))
    });
}

使用该作用域,您现在可以像这样查询票证:

代码语言:javascript
运行
复制
$tickets = exhibitor()->tickets()->withTrashed()->billsSince($since);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54941636

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档