首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Laravel Eloquent :什么是Eloquent模型的生命周期

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

Stack Overflow用户
提问于 2018-07-31 03:34:54
回答 2查看 1K关注 0票数 1

使用此代码(理论上)

代码语言:javascript
复制
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()时,它返回以下结果

代码语言:javascript
复制
 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?

代码语言:javascript
复制
$app = Application::find(2);
$app->getOnlineApplication(); // return null. I expected 2 as result

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

EN

回答 2

Stack Overflow用户

发布于 2018-07-31 03:45:05

雄辩的查询生成器使用Model::newFromBuilder补充结果。

代码语言:javascript
复制
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传递属性之间的主要区别在于后者通过传递大量赋值异常和突变。

票数 2
EN

Stack Overflow用户

发布于 2018-07-31 03:46:00

在幕后,Laravel实例化你的模型,然后执行"find“方法。尽管看起来find是一个静态方法,但它不是。

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

尽管它与您的问题没有直接关系,但您似乎正在尝试将$this->id赋值给$this->onlineApplication --请考虑以下代码,它们将完美地满足您的需求:

将您的类更改为:

代码语言:javascript
复制
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'];
   }
}

或者更简单:

代码语言:javascript
复制
class Application extends Model
{

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

   public function getOnlineApplication()
   {
       return $this->attributes['id'];
   }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51601102

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档