2017-05-20 55 views
0
延長

我目前試圖在Laravel建立一個非常簡單的CMS,比如我有一個基本的entities表(和型號),具有結構如下:創建基表,並從它在Laravel

{ 
    id: int, 
    slug: string 
} 

和其他幾個表(pagesblogposts等),具有結構類似以下內容:

{ 
    id: int, 
    title: string, 
    content: string, 
    entity_id: int 
} 

的想法是,應用程序獲取URL,發現蛞蝓匹配的實體,然後發現correspondi ng Page,Blogpost

這是最後一步,我想不出如何實現。我應該添加一個model_name列到entities表,所以我可以知道哪個Model查詢?我研究過多態關係,但我不認爲它們一定是我要找的,因爲這是非常一對一的關係。

+0

我可以知道需要將slu storing儲存在單獨的表格中嗎?要回答你的問題,你只需要在你的'Page'和'BlogPost'模型上使用'hasOne'關係來使用'Entity'模型。 – Sandeesh

+0

嗨@Sandeesh,所以我通過Entity :: where('slug',$ slug) - > firstOrFail();來獲取我的實體對象。'然後我如何獲取'Page','BlogPost'等與該實體相關聯的對象? – rwacarter

+0

我已經添加了我的答案,以更好地解釋這一點。 – Sandeesh

回答

0

要回答你的問題,你需要這樣做。

在網頁和博客帖子模型

public function entity() 
{ 
    return $this->hasOne('App\Entity'); 
} 

在實體模型

public function page() 
{ 
    return $this->belongsTo('App\Page'); 
} 

public function blogPost() 
{ 
    return $this->belongsTo('App\BlogPost'); 
} 

控制器邏輯

$entity = Entity::where('slug', $slug)->firstOrFail(); 
$page = $entity->page; 
$blogPost = $entity->blogPost; 

// OR 

$page = Page::whereHas('entity', function ($query) use ($slug) { 
    $query->where('slug', $slug); 
})->get(); 

$blogPost = BlogPost::whereHas('entity', function ($query) use ($slug) { 
    $query->where('slug', $slug); 
})->get(); 

但最好這是一個糟糕的實現。您應該使用多態關係將實體表中的頁面或博客文章的ID存儲在實體表中。然後在用slug過濾之後使用這個參考頁面或博客文章。

您可以將實體表重命名爲sluks以便更有意義。

slugs 
    id - integer 
    name - string 
    slugable_id - integer 
    slugable_type - string 

這消除了您檢查實體是否有頁面或博客帖子並直接獲取相關模型。