使用此代码(理论上)
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表的映射值?
答案 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'];
}
}