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

Php Laravel Eloquent:什么是Eloquent模型的生命周期,php,laravel,eloquent,Php,Laravel,Eloquent,使用此代码(理论上) 例如,当我调用Application::all()时,它返回这个结果 Illuminate\Database\Eloquent\Collection {#2954 all: [ App\Application {#2955 id: 1, name: "isipa.cd", app_identifier: "569161", server_id: 1, zone_dns: "7b716ac4ab6c1c442133c

使用此代码(理论上)

例如,当我调用
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']
可以返回应用程序表的映射值时?

雄辩的查询生成器将结果与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;
}
在这里,您可以看到创建了一个新的空白实例,然后用setrawtattributes填充属性。因此,构造函数中尚不存在
$this->id
$this->attributes['id']

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



查看代码,通过构造函数传递属性和通过setRawAttributes传递属性之间的主要区别似乎是后者通过大量分配异常和突变进行传递。

幕后拉威尔实例化您的模型,然后执行“查找”方法。 虽然find似乎是一种静态方法,但事实并非如此

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

<>虽然它与你的问题没有直接关系,但看起来你想把$--id分配给$->在线应用程序——请考虑下面的代码,这些代码将完全适合你的需要:

将您的班级改为:

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'];
   }
}

很好,但是
find
返回一个应用程序对象,我认为它是通过构造函数实例化的,即使find是静态调用的。我现在想知道,$this->id何时可用?没错,最后你得到了一个应用程序对象,但它不会按照你的计划工作。我看到您试图将$this->id分配到$this->Online应用程序中,这就是您想要的吗?只有在find方法被执行后它才可用。是的。。。我将执行另一个需要
$this->id可用性的代码。请检查我修改后的答案,看看它是否回答了您的问题。如果您提供了一个更好的示例,说明为什么您需要构造函数中的id,我可能能够更新我的答案,以更好地解决您的特定问题。将一个属性设置为与另一个“属性”相同的值似乎是多余的。问题已更新!
class Application extends Model
{

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

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