Schema.org + Laravel = 方式太复杂?

Schema.org + Laravel = way too complicated?

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

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

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

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

然而,当我想做 "find all employees for organization X whose name is 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 是否有一种简单的方法来处理像这样的复杂关系,或者是永远不要让你的关系变得如此复杂的答案?

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

好多了。

另外,

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

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

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

在Laravel中这是