路线模型绑定和软删除 - Laravel 4

时间:2013-10-18 09:01:38

标签: php model laravel laravel-4 ioc-container

当使用软删除和路由到模型绑定时,如果它被“软删除”,则无法查看注入的模型时会出现这种情况。

e.g。

我有一个工作模型。如果我“垃圾”其中一个模型然后打开垃圾并尝试查看工作模型我得到404资源未找到。我通过使用Route :: bind()函数解决了这个问题

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

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

虽然这看起来没什么必要而且有点傻......有没有办法解决这个问题,所以我可以使用非常雄辩的一行绑定:

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

3 个答案:

答案 0 :(得分:3)

由于 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方法时要小心。

答案 1 :(得分:3)

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

稍微改进一点,您可能希望指定包含已删除模型的特定键。

E.g。像这样有正常的路由模型绑定:

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

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

答案 2 :(得分:1)

除此之外,如果您已经构建了自己的特征和范围,则可以在其中定义查找功能。例如,我有一个" approvedTrait"它的工作方式相同,但是已经批准了#34;列,以显示主持人是否已批准某些内容。然后我把它放在我的approvedTrait课程中:

public static function find($id, $columns = array('*'))
{
    return self::withUnapproved()->find($id, $columns);
}