10

当使用软删除和路由到模型绑定时,如果已“软删除”,您将无法查看注入的模型。

例如

我有一个工作模型。如果我“回收”这些模型之一,然后打开回收站并尝试查看作业模型,我会得到一个 404 资源未找到。我通过使用 Route::bind() 函数解决了这个问题

Route::bind('job', function($id, $route) {

    return Job::withTrashed()->find($id);
});

虽然这似乎没有必要而且有点傻......有没有办法解决这个问题,所以我可以使用非常雄辩的单行绑定:

Route::model('job', 'Job');
4

3 回答 3

5

您在问题中概述的内容似乎可以解决它。

一个细微的改进是您可能希望指定哪个特定键包含已删除的模型。

例如,有正常的路由模型绑定,如下所示:

Route::model('job', 'Job');

并定义另一个键,例如“anyjob”,您还可以在其中查询已删除的作业:

Route::bind('anyjob', function($id) {    
    return Job::withTrashed()->find($id);
});

然后对于您不想包含已删除作业的路线,您只需参考job

get('/jobs/{job}/edit', ['controller' => 'JobsController@edit']); // We don't want to be able to edit a trashed job.

并且仅参考anyjob可以接受已丢弃作业的路由的绑定:

delete('/jobs/{anyjob}', ['controller' => 'JobsController@destroy']); // we could then forceDelete the trashed job for example as it'll be correctly injected in out our controller method

这可以防止您最终在控制器方法中使用软删除模型,否则这些模型不应该处理它们。您指定可以接受任何工作,甚至只是丢弃工作的确切路线。

于 2015-10-13T14:31:37.930 回答
4

由于Route::model()在模型上使用find方法,您可以简单地覆盖该方法来检索已丢弃的对象:

class Job extends Eloquent
{
    public static function find($id, $columns = array('*'))
    {
        return parent::withTrashed()->find($id, $columns);
    }
}

现在您可以使用没有闭包的模型绑定

Route::model('job', 'Job');

使用 find 方法时要小心,您不想检索已删除的对象。

于 2014-07-04T11:02:45.923 回答
1

除此之外,如果您已经构建了自己的特征和范围,您可以在其中定义 find 函数。例如,我有一个“approvedTrait”,它的工作方式相同,但有一个“approved”列来显示某个内容是否已被版主批准。然后我简单地将它放在我的approvedTrait 类中:

public static function find($id, $columns = array('*'))
{
    return self::withUnapproved()->find($id, $columns);
}
于 2015-02-10T15:33:03.980 回答