Schema.org + Laravel =太复杂了?

时间:2015-10-18 01:57:41

标签: php laravel orm schema

我最近完成了我的第一个Laravel项目(我真的很喜欢框架的外观,并想尝试一下)并反思我认为我做得好,做得不好,以及我想做什么不同下次。

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

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

  • 创建Person模型
  • Person有多个Role s
  • Customer (变形)Role
  • Employee (变形)Role
  • Organization有多个Employee s
  • Organization有多个Customer s

起初这看起来不错,因为一个人可以 一个员工一个客户(您可以在WalMart购物并为WalMart工作)。此外,由于一个人可以有多个角色,他们可以是多个客户和多个员工 - 如果他们在多个商店购物或者他们有两个工作。

但是,当我想做“为组织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是否有一种简单的方法来处理这样的复杂关系,或者只是永远不会让你的关系变得复杂?

2 个答案:

答案 0 :(得分:2)

在模型上添加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();

好多了。

答案 1 :(得分:0)

另外,

我确实在 https://github.com/noud/seo

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

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

在Laravel中,这是