Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Laravel 5 Laravel存储库模式和多对多关系_Laravel 5_Repository Pattern_Ddd Repositories - Fatal编程技术网

Laravel 5 Laravel存储库模式和多对多关系

Laravel 5 Laravel存储库模式和多对多关系,laravel-5,repository-pattern,ddd-repositories,Laravel 5,Repository Pattern,Ddd Repositories,在我们的新项目中,我们决定使用六边形结构。我们决定使用存储库模式来获得更多的数据访问抽象。我们使用命令总线模式作为服务层。 在我们的仪表板页面中,我们需要大量数据,因此我们应该使用3级多对多关系(用户->项目->技能->审查),并且技能应该是活动的(状态=1) 问题来了,我应该把这个放在哪里 $userRepository->getDashboardData($userId) 2.$userRepository->getUser($userId)->withProjects()->withAct

在我们的新项目中,我们决定使用六边形结构。我们决定使用存储库模式来获得更多的数据访问抽象。我们使用命令总线模式作为服务层。 在我们的仪表板页面中,我们需要大量数据,因此我们应该使用3级多对多关系(用户->项目->技能->审查),并且技能应该是活动的(状态=1)

问题来了,我应该把这个放在哪里

  • $userRepository->getDashboardData($userId)
  • 2.$userRepository->getUser($userId)->withProjects()->withActiveSkills()->withReviews()

    3.$user=$userRepository->getById(); $projects=$projectRepository->getByUserId($user->id); $skills=$skillRepository->getActiveSkillsByProjectsIds($ProjectId)

    在这种情况下,我找不到存储库模式的好处,除了使用ModelInterface可以实现的接口编码。 我认为解决方案3是完美的,但它增加了很多工作。

    您必须(例如)从面向对象的角度来确定返回的“用户”是否具有一系列技能。如果是这样,您返回的用户将已经拥有这些对象

    在使用常规对象的情况下,尽量避免使用子实体,除非这样做很有意义。比如说用户实体负责确保子实体遵守业务规则。更愿意使用不同的存储库根据任何其他标准选择其他类型的实体

    以这种方式谈论“关系”让我觉得你在使用ActiveRecord,因为否则它们只是子对象。“关系”存在于关系数据库中。只有将数据库记录/对象与AR混合使用时,它才会潜入对象中

    在使用ActuvReCordD对象的情况下,您可以考虑在存储库上使用特定的方法来加载正确配置的成员对象。代码>$members->allIncludingSkills()或者类似的东西这是因为在返回多个实体时必须求解N+1。然后,需要对结果集使用即时加载,而不希望对每个请求使用相同的即时加载配置。。因此,您需要一种方法来描述每个请求的配置。。一种方法是针对不同的请求在存储库上调用不同的方法

    然而,对我来说。。我不希望有一堆只有..的东西。。无限延伸。。例如您可以拥有
    $member->posts[0]->author->posts[0]->author->posts[0]->author->posts[0]

    我更喜欢让事情尽可能“平淡”。

    $member = $members->withId($id);
    $posts = $posts->writtenBy($member->id);
    
    或者类似的。(只是在头顶上打字)

    没有人喜欢成吨的嵌套数组,ActiveRecord可能被滥用,以至于其对象本质上是带有方法的数组,并且可能无限嵌套。因此,虽然它是处理数据的一种方便方式。我会努力防止滥用人际关系作为一个概念,并尽可能保持你的结构平坦

    在没有ORM“关系”功能的情况下编写代码是非常可能的。。这通常比较容易。。您可以看出,这个功能增加了很多麻烦,因为为了减轻痛苦,ORM必须提供多少功能

    真的,这有什么意义?它只是让您不必使用特定成员的ID进行查找?我想,也许循环一大堆不同的东西更容易些

    只有在ActiveRecord情况下,如果您希望能够单独测试代码,存储库才真正特别有用。否则,您可以使用Laravel的内置功能创建作用域等等,以防止到处都需要冗余(因而是脆弱的)查询逻辑

    创建专门针对UI的模型也是完全合理的可以有多个ActiveRecord模型使用相同的数据库表,例如,仅用于特定用户界面用例。例如,仪表板。如果你有一个新的用例。。您只需创建一个新模型

    这个,对我来说。。是设计系统的核心。自问。。好的,当我们有一个新的用例时,我们必须做什么?如果答案是肯定的,那么我们的架构就是这样的,我们只需要做这个和这个,而不必真的去搞乱其他的。。那太好了!否则,答案可能更像。。我不知道。。我想修改一下一切,希望它能起作用

    有很多方法可以解决这个问题。但是,我建议避免使用大量复杂的工具来换取更简单的方法/解决方案。存储库是一种提取数据持久性以允许隔离测试的好方法。如果您想单独测试,请使用它。但是,我不确定我对ORM关系如何与对象模型协同工作有多感兴趣。

    $member = $members->withId($id);
    $posts = $posts->writtenBy($member->id);
    
    例如,我们是否有包含以下内容的大型成员对象

    • 该成员曾经留下的所有评论
    • 成员拥有的所有技能
    • 该成员提出的所有建议
    • 所有好友邀请会员已发送
    • 成员已建立的所有朋友
    我不喜欢这些巨大的物体被设计成可以容纳所有东西的容器。我更喜欢将对象分解成专门为用例设计的部分

    但是,我在闲逛。简言之

  • 不要滥用ORM关系功能。
  • 最好有多个专门为一个用例设计的小对象,而不是几个大对象来完成所有任务。

  • 只有我的2美分。

    我非常感谢你花时间帮助我。我也喜欢尽可能地保持事物的平面,但是N-N关系打破了这种关系