我想知道在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/
的文件中注册?
我希望你不要像我一样困惑:(
答案 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_issue
,magazine_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。