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 模型忽略

laravel 基础教程 —— Eloquent

laravel 检索值匹配数据透视表的所有用户

Laravel 动态下拉获取数据问题

我可以更改在 laravel 的身份验证系统中使用的模型用户吗?

如何在 Laravel 5.8 中获取关注用户的帖子