有没有更好的方法在Laravel中使用存储库分配Eloquent关系?

时间:2016-04-02 03:35:49

标签: laravel laravel-5 eloquent

假设我有这两个模型UserAccount
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来抽象数据库层。

1 个答案:

答案 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(如果帐户需要)。