Laravel:每个表都需要模型吗?
Posted
技术标签:
【中文标题】Laravel:每个表都需要模型吗?【英文标题】:Laravel: Does every table need a model? 【发布时间】:2014-08-14 03:23:59 【问题描述】:我正在使用 Laravel 构建一个场合系统。我有几张桌子,例如:
场合 occasion_categories(汽车、三轮车和其他)现在我有一个名为 Occasion
的模型,它代表表场合,它还有一个外键到场合类别表。
我想检索所有场合类别,但是
我是否需要为场合类别创建一个名为 OccasionCategory
的单独模型并定义这些模型中的所有关系,
或者我可以在Occasion
类中创建一个方法,如getCategories()
,然后使用DB
类,如DB::table('occasion_categories')->get()
来检索所有可能的类别?
【问题讨论】:
是的,这完全有可能......如果为类别创建单独的模型似乎有点过头了,那么这将是一个更好的方法。但是,如果这些类别稍后会与其他事物相关联,那么实现一个模型可能会更好。这一切都取决于它需要如何连接。如果它只是一个引用,那么只需在 Occasion 模型中创建一个方法即可。 【参考方案1】:2019 年 10 月 4 日更新:
简而言之,NO
,您可以使用Query Builder
而不是Eloquent ORM
,但如果您想使用Eloquent ORM
,那么每个表都必须绑定到model
。此外,模型不一定必须是Eloquent model
,您可以在不扩展可能使用或不使用数据库的 eloquent 模型的情况下创建模型。模型并不意味着数据库访问层,但是……无论如何,这是另一个大话题。
原答案:
如果你使用Eloquent
,实际上你需要为你的两个表创建两个Eloquent
模型,例如:
class Occasion extend Eloquent
// Laravel will look for occasions table for Occasion model so following line
// is optional if you don't want to use another table name for Occation model
protected $table = 'occasions';
// Now declare the relationship with "occasion_categories" table
public function occasionCategory()
// Make sure you have used occasion_categories_id as the foreugn key
return $this->belongsTo('OccasionCategory', 'occasion_categories_id', 'id');
现在创建OccasionCategory
模型:
class OccasionCategory extend Eloquent
protected $table = 'occasion_categories';
// Now declare the relationship with "occasion_categories" table
public function occasions()
// Make sure you have used occasion_categories_id as the foreign key
return $this->hasMany('Occasion', 'occasion_categories_id', 'id');
现在您可以使用类似这样的方式检索带有其父场合类别的场合:
// Use the Occasion model
$allOccasionsWithCategory = Occasion::with('occasionCategory')->get();
// Find one Occasion whose id is 1 with OccasionCategory
$oneOccasionsWithCategory = Occasion::with('occasionCategory')->find(1);
// You may use this to get the related occasionCategory model
$occasionCategory = $oneOccasionsWithCategory->occasionCategory;
// Use the OccasionCategory model
$allOccasionsWithCategory = OccasionCategory::with('occasions')->get();
// Find one OccasionCategory whose id is 1 with Occasion
$oneOccasionsWithCategory = OccasionCategory::with('occasions')->find(1);
// You may use this to get all the related occasions model
$occasions = $oneOccasionsWithCategory->occasions;
在Laravel
网站上阅读有关relationship 的更多信息。
如果你直接使用Query Builder
,那么你可以使用这样的东西(没有模型):
// All occations
$occations = DB::table('occations')->get();
// All occasions and related occasion_categories
$occationsAndCategories = DB::table('occations')
->join('occasion_categories', 'occasions.occasion_category_id', '=', 'occasion_categories.id')
->get();
在Laravel
网站上阅读有关Query Builder 的更多信息。
【讨论】:
请注意 - 将all()
替换为 get()
。 all
是一种静态方法,可转换为非静态 get
,在方法链中不起作用。
这只是向用户解释了这两个选项,而没有提供任何关于哪个可能更好或被认为是“最佳实践”的推理。或者甚至只是说“你可以同时做这两个”来承认这个问题,没有一种方法优于另一种方法。
@ChuckLeButt,根据您的评论更新。【参考方案2】:
laravelish 做数据库的方法是使用Query Builder 或Eloquent:Laravel 是一个框架,利用它公开的资源总是有意义的。
Laravel:每个表都需要模型吗?
简短的回答:
不,只要你不使用它就不会 口才。
长答案:
查询生成器是您仍想坚持使用的方法 laravel 约定。
您也可以使用普通的旧 PDO: 记住 Laravel 实际上是一个 php 框架!
我的看法:
保持一致总是值得的:
尽管您可以按照您的建议混合使用 Eloquent
和一些 Query Builder
,但还是按照 Eloquent
的方式(模型 + 关系定义)进行操作。
只使用Query Builder
也是一致且可行的。
我个人偏好Eloquent
选项。
解决办法:
WereWolf - The Alpha answer 提供了使用这两个选项的绝佳解决方案。
【讨论】:
谢谢我的意思。 好答案。这在很大程度上取决于偏好,但有时最好对您的选择放心【参考方案3】:只是想在这里更新一下。
在这个特定的例子中,我不确定自从发布后事情是否发生了变化(可能是错误的,总是有更多发现),但在多对多关系的情况下,一对一的关系由于 pivot() 方法,表格和模型之间的关系被破坏了。
取自我自己的一个项目:
public function fees()
return $this->belongsToMany(Service::class)->withPivot("description");
这样,您可以拥有两个模型(“Fee”和“Service”),但您可以访问中间表上的数据,而无需“ServiceFee”模型。
在刀片中:
$service->pivot->description
乍看之下,这似乎微不足道,但如果得到足够多的多对多关系,数字表甚至可以超过模型的数量。 (这个假设的场景是否一定是精心设计的,遗憾的是我没有时间思考。)
【讨论】:
【参考方案4】:虽然我不积极,但我很确定这会奏效。或者,DB::raw('select * from occasion_categories')
应该可以工作。
我不知道这里的最佳做法是什么,但如果您只是询问是否可行,那么可以。这两种方法中的一种应该可以正常工作。
【讨论】:
以上是关于Laravel:每个表都需要模型吗?的主要内容,如果未能解决你的问题,请参考以下文章
phpMyAdmin 将列设置为主键但 Laravel 模型忽略