在为模型定义构造函数时,Laravel 5.3软删除不起作用

时间:2018-03-19 13:42:40

标签: laravel laravel-5 model

我有一个模型测试如下

namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class Test extends Model
{
use SoftDeletes;
protected $dates = ['deleted_at'];
public function __construct() {
    if (!\App::environment('production')) {
        $this->table='test_stage';
    }
}

我确保test_stage表中有一个'deleted_at'列。但软删除不起作用。使用delete()方法永久删除表中的记录。作为验证的附加步骤,我手动为某些列添加了“deleted_at”值。但查询模型仍然给我软删除记录。

此外,完全删除模型构造函数,并使用:

简单地定义表名
protected $table = 'test_stage';

像魅力一样!那是软删除神奇地再次开始工作。

或者有没有办法根据环境定义表名而无需定义构造函数?

1 个答案:

答案 0 :(得分:6)

我认为问题可能是你要覆盖Illuminate\Database\Eloquent\Model中设置的构造函数。你试过吗

   public function __construct(array $attributes = []) {
       parent::__construct($attributes);
       if (!\App::environment('production')) {
           $this->table='test_stage';
       }
   }  

编辑:更详细的解释

当您覆盖正在扩展的课程的constructor时,原始内容将不再执行。这意味着不能执行雄辩模型的必要功能。请参阅以下constructor的{​​{1}}:

Illuminate\Database\Eloquent\Model

通过确保扩展类需要与扩展类相同的构造函数参数并首先执行/** * Create a new Eloquent model instance. * * @param array $attributes * @return void */ public function __construct(array $attributes = []) { $this->bootIfNotBooted(); $this->syncOriginal(); $this->fill($attributes); } parent::__construct($attributes);为首先执行扩展类。之后,您可以在扩展类中覆盖constructor