Laravel Eloquent 与存储库/服务设计模式的关系

Posted

技术标签:

【中文标题】Laravel Eloquent 与存储库/服务设计模式的关系【英文标题】:Laravel Eloquent Relationships with Repository/Service Design Pattern 【发布时间】:2015-03-08 07:36:09 【问题描述】:

我目前正在开发一个使用存储库/服务层设计模式设置的 Web 应用程序,即我有一个服务层,它在运行存储库中的任何方法之前执行任何必要的业务逻辑。我的每个模型都有外观,可以访问它们各自的服务层,这在大多数情况下都很好。然而,现在我正在尝试建立 Eloquent 关系,外观似乎引起了巨大的头痛,因为我不确定我应该往哪个方向发展。

取以下代码:

class Account extends Eloquent 

    // Our table name
    protected $table = "accounts";

    // Our primary key
    protected $primaryKey = "id";

    /**
     *  Role Relationship
     *
     *  Returns a list of roles associated with 
     *  this account
     */
    public function roles() 
        return $this->hasMany('Role');
    


这不会按原样工作,因为它不是使用 Role 的实体类,而是使用 Role Facade。我已经找到了一种解决方法,方法是为实体设置一个名称稍有不同的别名,例如 RoleEntity 以便

    public function roles() 
        return $this->hasMany('RoleEntity');
    

会起作用,但这似乎不是最佳解决方案。

我的问题是,练习可以吗?或者更好的是,这应该发生吗?如果没有,我该如何解决/我哪里出错了?

【问题讨论】:

我建议你把你的模型和外观放在不同的命名空间中,并像App\Models\Role这样引用模型 【参考方案1】:

在同一个命名空间中有两个同名的类。使用不同的命名空间,以便您可以使用相同的类名。

我通常使用 \Models 来定位我的模型类。

在每个模型文件的顶部:

namespace Models;

在您的控制器或应用的任何部分中:

\Models\Role::first();

请注意,更改模型上的命名空间将需要您添加其他类的命名空间,即 Str、Eloquent、Url、Redirect 等。

use Eloquent;
use URL;

在您的模型中,您还必须在关系函数中传递命名空间,即:

public function roles() 
    return $this->hasMany('\Models\Role');

【讨论】:

感谢您的帮助。我实际上为每个类使用不同的命名空间。对于我的 Account 类(以及任何其他类似的模型),我使用的是“命名空间实体;”对于我的外墙,我使用的是“命名空间服务\(模型名称);”,即“命名空间服务\帐户;”。也就是说,执行类似“return $this->hasMany('\Entities\Role');”的操作似乎确实有效,虽然它似乎不是一个理想的解决方案,但它现在应该有效。 好的,将其添加到答案中。另外,为什么它不是一个理想的解决方案?

以上是关于Laravel Eloquent 与存储库/服务设计模式的关系的主要内容,如果未能解决你的问题,请参考以下文章

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

Laravel Eloquent 坚持 1:n

Laravel Eloquent与逗号分隔字段的关系

Laravel Eloquent ORM 无法正确返回模型的关系

将 Haversine 公式与 Laravel eloquent 和多个 where 子句一起使用

Laravel 8.x - 使用 Eloquent 关系存储数据