Eloquent morphTo()-withTrashed() 停止工作

laravel

1个回答

写回答

Jia_aaaaaa

2025-07-09 11:45

+ 关注

Laravel
Laravel

使用Laravel框架开发时,我们经常会遇到需要处理多态关联模型的情况。Laravel提供了一个非常方便的方法来处理这种关联关系,即使用Eloquent的morphTo()方法。然而,在某些情况下,我们可能需要在查询多态关联模型时同时包含已软删除的记录。但是,当我们尝试使用morphTo()->withTrashed()方法时,可能会遇到一些问题,导致该方法无法正常工作。

在我们的应用程序中,我们可能有一个评论系统,其中评论可以用于多个模型,如文章、图片、视频等。为了实现这种多态关联,我们可以在评论模型中使用morphTo()方法来定义评论与其他模型的关联关系。

php

class Comment extends Model

{

public function commentable()

{

return $this->morphTo();

}

}

然后,在我们的控制器中,我们可以使用morphTo()方法来查询评论关联的模型。例如,我们可以查询与某个文章关联的所有评论。

php

$article = Article::find(1);

$comments = $article->comments()->withTrashed()->get();

在上面的代码中,我们使用withTrashed()方法来包含已软删除的评论记录。然而,当我们尝试运行这段代码时,可能会遇到一个问题,即无论我们的评论是否被软删除,都无法正确地获取到包含软删除记录的结果集。

问题分析

这个问题的原因是morphTo()方法与withTrashed()方法的执行顺序不正确。当我们使用morphTo()方法定义关联关系时,Laravel会生成一个morphTo()关联关系查询的查询构造器实例。然后,当我们调用withTrashed()方法时,Laravel会尝试在关联关系查询构造器实例上调用withTrashed()方法。然而,由于morphTo()方法返回的是一个关联关系查询构造器实例,而不是一个具体的模型实例,所以withTrashed()方法调用无法正常工作。

解决方法

为了解决这个问题,我们可以通过使用闭包来手动调整查询的执行顺序。我们可以在morphTo()方法中传递一个闭包,并在闭包中处理withTrashed()方法的调用。

php

class Comment extends Model

{

public function commentable()

{

return $this->morphTo()->withTrashed();

}

}

通过以上更改,我们可以正确地使用morphTo()->withTrashed()方法来查询包含已软删除记录的多态关联模型。现在,我们可以重新运行上面的代码,并正确地获取到包含软删除记录的评论结果集。

在开发过程中,当我们需要处理多态关联模型时,可以使用Laravel框架提供的morphTo()方法。然而,在某些情况下,当我们尝试使用morphTo()->withTrashed()方法时,可能会遇到无法正常工作的问题。为了解决这个问题,我们可以通过使用闭包来手动调整查询的执行顺序,从而正确地获取到包含软删除记录的结果集。

案例代码:

php

class Comment extends Model

{

public function commentable()

{

return $this->morphTo()->withTrashed();

}

}

$article = Article::find(1);

$comments = $article->comments()->withTrashed()->get();

通过上述代码,我们可以正确地获取到包含软删除记录的评论结果集。这样,我们就成功地解决了使用morphTo()->withTrashed()方法停止工作的问题。

举报有用(4)分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号