2

我想知道在 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/

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

4

3 回答 3

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 类,以简化对您的杂志域的访问:

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

}
于 2014-02-19T16:10:55.520 回答
3

首先,请记住您的表格都应该是复数形式 - magazine_issuesnot magazine_issuemagazine_issue_articlesnot 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 会让你的生活更轻松一些。

于 2014-02-19T15:28:08.447 回答
0

在深入研究 DB 和表之前,你应该让你的领域层围绕 Laravel模型组织。在您的情况下,由于您正在处理问题,因此模型的名称应该是问题。因此,在模型目录下创建新文件,并将以下行放入其中:

class Issue extends Eloquent{};

现在您有了域逻辑的起点。在问题模型中,您可以创建关系和所有相关规则(可填充的、受保护的......)。那是关于模型的,我不知道有没有将任何东西迁移到数据库。

于 2014-02-19T15:32:24.063 回答