当使用软删除和路由到模型绑定时,如果它被“软删除”,则无法查看注入的模型时会出现这种情况。
e.g。
我有一个工作模型。如果我“垃圾”其中一个模型然后打开垃圾并尝试查看工作模型我得到404资源未找到。我通过使用Route :: bind()函数解决了这个问题
Route::bind('job', function($id, $route) {
return Job::withTrashed()->find($id);
});
虽然这看起来没什么必要而且有点傻......有没有办法解决这个问题,所以我可以使用非常雄辩的一行绑定:
Route::model('job', 'Job');
答案 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);
}