使用此代码(理论上)
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']何时可以返回应用程序表的映射值?
发布于 2018-07-31 03:45:05
雄辩的查询生成器使用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传递属性之间的主要区别在于后者通过传递大量赋值异常和突变。
发布于 2018-07-31 03:46:00
在幕后,Laravel实例化你的模型,然后执行"find“方法。尽管看起来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'];
}
}https://stackoverflow.com/questions/51601102
复制相似问题