【发布时间】:2014-12-05 19:41:44
【问题描述】:
我有一个表帐户:
act_id,
act_name,
act_address
我有一个表地址:
add_id,
add_street1,
<other fields you'd expect in an address table>
accounts.act_address 是addresses.add_id 的外键。在 Laravel 中,我有我的 Account 模型:
use LaravelBook\Ardent\Ardent;
use Illuminate\Database\Eloquent\SoftDeletingTrait;
class Account extends Ardent
{
use SoftDeletingTrait;
protected $table = 'accounts';
protected $primaryKey = 'act_id';
public static $rules = array
(
'act_name' => 'required|unique:accounts'
);
protected $fillable = array
(
'act_name'
);
public function address()
{
return $this->hasOne('Address', 'add_id', 'act_address');
}
}
如您所见,我在这里设置了一对一的关系。 (当然,Address 模型也有一个“belongsTo”)。这一切都有效。
问题是,地址外键可以为空,因为帐户不需要地址。因此,如果我在没有帐户的情况下尝试访问 Account->address,则会收到“尝试访问非对象的属性”错误。
如果帐户记录没有设置,我想做的是将 Account->address 设置为新的 Address 对象(所有字段为空)。
我能够做的是在模型中创建第二个方法:
public function getAddress()
{
return empty($this->address) ? new Address() : $this->address;
}
或者,即时添加:
if (empty($account->address))
$account->address = new Address();
第一个解决方案非常接近,但我真的很想将访问地址的功能保留为属性而不是方法。
所以,我的问题是:
如果 Account->address 为空/null,我如何让 Account->address 返回 new Address()?
哦,我尝试像这样覆盖 $attributes:
protected $attributes = array
(
'address' => new Address()
);
但这会引发错误。
【问题讨论】: