【问题标题】:Schema.org + Laravel = way too complicated?Schema.org + Laravel = 太复杂了?
【发布时间】:2016-01-16 13:36:25
【问题描述】:

我最近完成了我的第一个 Laravel 项目(我真的很喜欢这个框架的外观并想试一试),并且正在思考我认为自己做得好的地方、做得不好的地方以及我想做的不同的事情下一次。

我注意到我遇到的最大问题之一是,为了避免重复数据,我有一些非常可怕的工作要做,以便从我的数据库中提取有意义的信息。

在项目开始时,我使用schema.org 作为设计模型的粗略基础。例如,当我想存储Employees 和Customers 时:

  • 创建Person 模型
  • 一个Person hasMany Roles
  • 一个Customer 是一个(变形)Role
  • 一个Employee 是一个(变形)Role
  • 一个Organization有很多Employees
  • 一个Organization有很多Customers

起初这看起来不错,因为一个人可以既是员工客户(您可以在沃尔玛购物并为沃尔玛工作)。此外,由于一个人可以担任多个角色,因此他们可以是多个客户和多个员工——如果他们在不止一家商店购物,或者如果他们有两份工作。

但是,当我想要执行诸如“查找组织 X 中名为 John 的所有员工”之类的操作时遇到了问题:

$employees = $organization->employees;
$employeesNamedJohn = new Collection();
foreach( $employees as $employee ) {
    if( $employee->role->person->name == 'John' )
        $employeesNamedJohn->add( $employee );
}

这似乎非常复杂(更不用说效率低下),特别是考虑到如果我没有发明混乱的架构,它只会是一个单行:

$employees = $organization->employees()->where('name', 'John')->get();

那我是不是做错了什么? Laravel 是否有一种简单的方法来处理这样的复杂关系,或者说永远不要让你的关系变得如此复杂?

【问题讨论】:

    标签: php laravel orm schema


    【解决方案1】:

    在你的模型上添加query scopes 真的很有帮助:

    class Role extends Model
    {
        public function scopeNamed($query, $name)
        {
            $query->whereHas('person', function ($query) use ($name) {
                $query->where('name', $name);
            });
        }
    }
    
    class Employee extends Model
    {
        public function scopeNamed($query, $name)
        {
            $query->whereHas('role', function ($query) use ($name) {
                $query->named($name);
            });
        }
    }
    

    那么你可以这样做:

    $employees = $organization->employees()->named('John')->get();
    

    好多了。

    【讨论】:

      【解决方案2】:

      作为额外的,

      我确实实现了 Josheph Silber 他的回答 https://github.com/noud/seo

      在 readme.md 中查看下面的实体关系图 具有字段的实体角色

      • roleable_id(外键指向的id)
      • roleable_type(外键指向的实体)

      在 Laravel 中这是

      【讨论】:

        猜你喜欢
        • 2021-04-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-20
        • 1970-01-01
        • 2012-08-18
        • 2018-02-12
        • 1970-01-01
        相关资源
        最近更新 更多