假设我有这两个模型User
和Account
。
User
可以包含多个Accounts
的位置。 (有很多)
Account
属于User
。 (属于关联)
如果我不使用存储库,我会保存模型及其关系,如下所示:
$account = new Account();
$account->username = $this->username;
$account->secret = $this->secret;
$account->user()->associate($this->user);
$account->save();
使用存储库时,我看到很多人(和文章)这样做:
$accountRepository->create([
'username' => $this->username,
'secret' => $this->secret,
'user_id' => $this->user()->id,
]);
我对这种方法的问题出在user_id
,因为手动分配这种关系并不安全,另外当别人正在阅读这段代码时,他无法分辨出{{1}之间的关系是什么。从那里1}}和Account
!!
我目前正在处理的方式如下:(它是两种方式的组合)
User
但我不确定是否有更好的方法来做到这一点!
我只需要使用 // create the account and attach the fields and the relationships
$account = new Account();
$account->username = $this->username;
$account->secret = $this->secret;
$account->user()->associate($this->user);
// save the new created model with the repository
$account = $accountRepository->create($account->toArray());
功能,因为它对读者来说更安全,看起来更好。并使用存储库来保存和访问我的数据。
注意:我使用https://github.com/andersao/l5-repository来抽象数据库层。
答案 0 :(得分:0)
您正在设计自己的存储库,因此您可以根据需要使功能明确。无需传入数据数组中的相关字段或对象,而是将额外的依赖项添加为额外的参数。
class AccountRepository
{
public function create($attributes, $user = null) {
$account = new Account($attributes);
if (!empty($user)) {
$account->user()->associate($user);
}
$account->save();
return $account;
}
}
现在,您可以这样调用您的函数:
$accountRepository->create([
'username' => $this->username,
'secret' => $this->secret,
], $this->user());
现在你的调用代码只知道它调用的函数的依赖关系。它不需要知道它们如何相关的细节,或者必须设置来关联它们的键。它只知道函数需要 User
(如果帐户需要)。