2014-02-19 95 views
2

我想知道在eloquent/laravel 4.1模型中創建下列表和關係的最佳做法是什麼。laravel模型,類名,表名和目錄結構最佳實踐

  • 表名magazines與領域id, title
  • 表名magazine_issues與領域id, title, magazine_id
  • 表名magazine_issue_articles與領域id, title, body, magazine_issue_id

我需要的文件/目錄結構和所有類的命名和文件,因爲我真的很困惑,例如,我應該創建一個名爲magazines的目錄,並將Issue.php文件重新和像這樣的文章?班級本身的名字應該是什麼?

預先感謝您。

編輯

我需要他們的子文件夾,因爲這將是更加便攜。問題是... 將名爲magazineIssue(帶有表名magazine_issues)的類自動加載並在名爲Magazine/的目錄中從名爲Issue.php的文件註冊?

我希望你不一樣困惑,因爲我:(

回答

6

如果你想創建這樣想泰勒Otwell和「核心」正試圖教人在Laravel做的事情,這是一個良好的開端:

你的文件可以組織爲

├── app 
│   ├── Publishing 
│   │   ├── Models 
│   │   │   ├── Magazine 
│   │   │   │   ├── Magazine.php 
│   │   │   │   ├── Issue.php 
│   │   │   │   ├── Article.php 
│   │   ├── BaseModel.php 
│   │   ├── Repositories 
│   │   │   ├── MagazineRepository.php 

配置一個PSR-0或PSR-4(更好)自動加載你的類:

"psr-0": { 
    "Publishing": "app/" 
}, 

創建命名空間BaseModel:

<?php namespace Publishing\Models 

use Eloquent; 

class BaseModel extends Eloquent { 

} 

創建命名空間中的型號,可根據您的源代碼樹:

<?php namespace Publishing\Models\Magazine 

use Publishing\Models\BaseModel; 

class Magazine extends BaseModel { 

    protected $table = 'magazines'; 

} 

<?php namespace Publishing\Models\Magazine 

use Publishing\Models\BaseModel; 

class Issue extends BaseModel { 

    protected $table = 'magazines_issues'; 

} 

<?php namespace Publishing\Models\Magazine 

use Publishing\Models\BaseModel; 

class Article extends BaseModel { 

    protected $table = 'magazines_issues_articles'; 

} 

您可能還需要創建一個MagazineRepository類,緩解訪問您的雜誌域:

<?php namespace Publishing\Repositories; 

use Publishing\Models\Magazine\Magazine; 
use Publishing\Models\Magazine\Issue; 
use Publishing\Models\Magazine\Article; 

class MagazineRepository implements DataRepositoryInterface { 

    private $state; 

    public function __construct(
            Magazine $magazine, 
            Issue $issue, 
            Article $article 
           ) 
    { 
     $this->magazine = $magazine; 
     $this->issue = $issue; 
     $this->article = $article; 
    } 

    public function getAll() 
    { 
     return $this->magazine->all(); 
    } 

    public function findArticle($articleId) 
    { 
     return $this->article->find($articleId); 
    } 

    public function getByArticle($articleId) 
    { 
     return $this->findArticle($articleId)->magazine; 
    } 

} 
2

首先,記住,你的表都應該多 - magazine_issuesmagazine_issuemagazine_issue_articlesmagazine_issue_article

至於目錄結構,很多人嘗試使用命名空間並將模型放在Models子命名空間中。

也就是說,您的模型應該*與您的表名稱匹配,但將多個snake_case犯罪gular StudlyCaps。所以你最終應該有三種模式:

class Magazine extends Eloquent 
{ 
    public function issues() 
    { 
     return $this->hasMany('MagazineIssue'); 
    } 
} 

class MagazineIssue extends Eloquent 
{ 
    public function magazine() 
    { 
     return $this->belongsTo('Magazine'); 
    } 

    public function articles() 
    { 
     return $this->hasMany('MagazineIssueArticle'); 
    } 
} 

class MagazineIssueArticle extends Eloquent 
{ 
    public function issue() 
    { 
     return $this->belongsTo('MagazineIssue'); 
    } 
} 

但是,你把它們放在哪裏仍然取決於你。只要確保在關係中包含命名空間,就可以在關係中使用完全限定的類名稱。不過,我建議他們都進入相同的目錄和命名空間。

*我說你應該做這一切,但你可以自由地做你想做的。 '應該'的原因是,如果你遵循這些慣例,Laravel會讓你的生活變得更輕鬆。

+0

除了我在這裏對你的具體表格的官方建議,還有你可以做的其他事情。例如,可以在表格上放置前綴:查找「雜誌」,「問題」和「文章」 - 這將節省很多打字時間。無論哪種情況,如果您願意,可以爲模型使用子命名空間,但如果使用這些較短的表名,則更有意思。或者,保留表名,並在每個模型中指定一個'protected $ table ='whatever_table_name';'。你的選擇是無限的! – alexrussell

+0

你對錶中的複數是完全正確的,這是我的一個錯字(因爲這些不是實際的表,它們只是一個例子)。 –

+0

感謝您的評論,但刪除前綴並不是好事 - 取決於使用的內容,因爲可能還有其他內容的文章,例如'webpage_articles'或'online_articles',這是唯一的方法使表名稱自我解釋。 –

0

在深入研究數據庫和表格之前,您應該有一個圍繞Laravel 模型組織的域圖層。在你的情況下,因爲你正在處理問題,所以你的模型的名字應該是Issue。所以裏面下模式目錄中創建新的文件,並把下面一行:

class Issue extends Eloquent{}; 

現在你已經出發點爲您的域邏輯。內部問題模型,您可以創建關係和所有相關規則(可填充,守衛......)。 這是關於模型,我不知道有什麼遷移到數據庫。