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

And*_*gan 9 php model ioc-container laravel laravel-4

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

例如

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

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

    return Job::withTrashed()->find($id);
});
Run Code Online (Sandbox Code Playgroud)

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

Route::model('job', 'Job');
Run Code Online (Sandbox Code Playgroud)

har*_*ryg 5

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

稍微改进一下,您可能希望指定要包含废弃模型的特定键。

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

Route::model('job', 'Job');
Run Code Online (Sandbox Code Playgroud)

并定义另一个键,如“anyjob”,您还可以在其中查询垃圾作业:

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

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

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

并且只引用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
Run Code Online (Sandbox Code Playgroud)

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


max*_*lms 4

由于Route::model()在模型上使用find方法,您可以简单地重写该方法来检索垃圾对象:

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

现在您可以使用模型绑定而无需闭包

Route::model('job', 'Job');
Run Code Online (Sandbox Code Playgroud)

如果您不想检索已废弃的对象,则在使用 find 方法时要小心。