2015-10-18 89 views
0

我最近完成了我的第一個Laravel項目(我非常喜歡這個框架的外觀,並試圖嘗試一下),並反思了我認爲我做得很好,我做得不好,以及接下來我想做什麼改變時間。Schema.org + Laravel =方式太複雜?

我注意到的一個最大的問題是,爲了避免重複數據,爲了從數據庫中提取有意義的信息,我做了一些相當可怕的工作。

在項目開始時,我使用schema.org作爲設計模型的粗略基礎。舉例來說,當我想存儲Employee S和Customer S:

  • 創建Person模型
  • 一個Person的hasMany Role小號
  • 一個Customer(變種)Role
  • Employee(morphs)Role
  • 一種Organization的hasMany Employee小號
  • Organization的hasMany Customer小號

起初,這似乎是不錯的,因爲一個人可以僱員客戶(你可以在沃爾瑪工作店沃爾瑪)。同樣,由於一個人可以有多個角色,他們可以是多個客戶和多個員工 - 如果他們在多個商店購物或者他們有兩個工作。

但是我遇到了問題時,我想要做的東西,如「找到組織X的名字全體員工是約翰」:

$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是否有一種簡單的方法來處理這種複雜的關係,或者答案就是永遠不會讓你的關係變得複雜?

回答

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(); 

好多了。