Laravel Eloquent:什么是Eloquent模型的生命周期

时间:2018-07-30 19:34:54

标签: php laravel eloquent

使用此代码(理论上)

class Application extends Model
{
   protected $onlineApplication;

   public function __construct(Array $attributes = [])
   {
        parent::__construct($attributes);
        if(!empty($this->id)){ //To say if model is already saved in database

            /*I fetch informations in api based on app_identifier attribute.
            Then, I can play with methodq to perform different actions. 
            For instance, self::getCredentials() according to what
            self::onlineApplication would have*/
        }
        $this->onlineApplication = $this->id;
   }

   public function getOnlineApplication()
   {
       return $this->onlineApplication;
   }
}

例如,当我致电Application::all()时,它将返回此结果

 Illuminate\Database\Eloquent\Collection {#2954
 all: [
   App\Application {#2955
     id: 1,
     name: "isipa.cd",
     app_identifier: "569161",
     server_id: 1,
     zone_dns: "7b716ac4ab6c1c442133cf03c475988b",
     created_at: "2018-07-29 04:59:57",
     updated_at: "2018-07-29 04:59:57",
   },
   App\Application {#2956
     id: 2,
     name: "ohelene.tk",
     app_identifier: "570161",
     server_id: 1,
     zone_dns: "090857997858a77f7ab635e47d6bcce8",
     created_at: "2018-07-30 14:12:03",
     updated_at: "2018-07-30 14:12:03",
   },
 ],

}

现在,我想知道的是为什么使用此代码—在下面—我有这个结果,为什么构造函数内部的$this->id返回null?

$app = Application::find(2);
$app->getOnlineApplication(); // return null. I expected 2 as result

何时$this->id$this->attributes['id']可以返回Application表的映射值?

2 个答案:

答案 0 :(得分:2)

雄辩的查询生成器使用Model :: newFromBuilder来混合结果。

public function newFromBuilder($attributes = [], $connection = null)
{
    $model = $this->newInstance([], true);

    $model->setRawAttributes((array) $attributes, true);

    $model->setConnection($connection ?: $this->getConnectionName());

    $model->fireModelEvent('retrieved', false);

    return $model;
}

因此,在这里,您可以看到创建了一个新的空白实例,然后用setRawAttributes填充属性。因此,$this->id$this->attributes['id']在构造函数中尚不存在。

您可以依靠触发检索到的事件来填充此属性,但是您提供的代码似乎根本没有理由存在此属性,因为它等于id。


看看代码,看起来通过构造函数传递属性和通过setRawAttributes传递属性之间的主要区别在于后者通过传递批量分配异常和变异。

答案 1 :(得分:0)

在后台,Laravel实例化您的模型,然后执行“查找”方法。 尽管看起来find是一个静态方法,但不是。

$ this-> id在实例化时不可用,仅在之后可用。

即使它与您的问题没有直接关系,但似乎您正在尝试将$ this-> id分配给$ this-> onlineApplication-请考虑以下代码,这些代码将完全适合您的需求:

将您的班级更改为:

class Application extends Model
{

   protected $appends = ['online_application'];

   public function __construct(Array $attributes = [])
   {
        parent::__construct($attributes);
   }

   public function getOnlineApplication()
   {
       return $this->online_application;
   }

   public function getOnlineApplicationAttribute(){
       return $this->attributes['id'];
   }
}

或更简单:

class Application extends Model
{

   public function __construct(Array $attributes = [])
   {
        parent::__construct($attributes);
   }

   public function getOnlineApplication()
   {
       return $this->attributes['id'];
   }
}