laravel模型,类名,表名和目录结构最佳实践

时间:2014-02-19 15:20:59

标签: php laravel models tablename

我想知道在eloquent / laravel 4.1模型中创建以下表格和关系的最佳做法是什么。

  • 表名magazines,其中包含字段id, title
  • 表名magazine_issues,其中包含字段id, title, magazine_id
  • 表名magazine_issue_articles,其中包含字段id, title, body, magazine_issue_id

我需要文件/目录结构以及所有类和文件的命名,因为我真的很困惑,例如我应该创建一个名为magazines的目录并将Issue.php文件放在那里像这样的文章?这个班级本身的名称应该是什么?

提前谢谢。

修改

我需要将它们放在子文件夹中,因为这样会更便携。问题是... 将名为magazineIssue(具有表名magazine_issues)的类自动加载并从名为Issue.php的目录中名为Magazine/的文件中注册?

我希望你不要像我一样困惑:(

3 个答案:

答案 0 :(得分:7)

如果你想创造像Taylor 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类,以便轻松访问您的Magazine Domain:

<?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;
    }

}

答案 1 :(得分:2)

首先请注意,您的表格应全部为复数 - magazine_issues而不是magazine_issuemagazine_issue_articles而不是magazine_issue_article

至于目录结构,使用Laravel它有点像你想要的。很多人尝试使用命名空间并将模型放在Models子命名空间中。

也就是说,你的模型应该*匹配你的表名,但是将复数snake_case转换为单数的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将使你的生活更轻松。

答案 2 :(得分:0)

在深入研究数据库和表格之前,您应该围绕Laravel 模型组织域域图层。在您的情况下,由于您正在处理问题,因此模型的名称应为“问题”。因此,在 models 目录下创建新文件,并将以下行放在:

class Issue extends Eloquent{};

现在你有了域逻辑的起点。在内部问题模型中,您可以创建关系和所有相关规则(可填写,保护......)。 这是模型,我不知道有什么东西迁移到DB。