Laravel:每张桌子都需要一个模型吗?

2022-08-30 23:22:03

我正在与Laravel一起构建一个场合系统。我有几个表格,如:

  • 场合
  • occasion_categories(轿车、三轮车等)

现在我有一个名为表示表场合的模型,它还具有occasion_categories表的外键。Occasion

我想检索所有场合类别,但

  • 我是否需要为occasion_categories创建一个分离模型,并定义这些模型中的所有关系,OccasionCategory

  • 或者我可以直接在类中做一个方法,然后使用类like来检索所有可能的类别?OccasiongetCategories()DBDB::table('occasion_categories')->get()


答案 1

更新于2019年10月4日:

简而言之,您可以使用 而不是 但是如果要使用,则每个表都必须绑定到 .此外,模型不一定是 ,您可以创建一个模型,而无需扩展雄辩的模型,该模型可能使用也可能不使用数据库。模型并不意味着数据库访问层,但...无论如何,这是另一个大话题。NOQuery BuilderEloquent ORMEloquent ORMmodelEloquent model

原始答案:

实际上,如果您使用的是 ,则需要为这两个表创建两个模型,例如:EloquentEloquent

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');
    }
}

现在,您可以使用如下内容检索其父occasions_category的场合:

// 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

如果你直接使用,那么你可以使用这样的东西(没有模型):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


答案 2

做数据库的拉维方法是使用查询生成器EloquentLaravel是一个框架,利用它公开的资源总是有意义的。


Laravel:每张桌子都需要一个模型吗?

简短的回答:

  • 不,只要你不使用Eloquent,它就不会。

长答案:

  • 查询生成器是您仍然希望坚持 laravel 约定的必经之路。

  • 您也可以使用普通的旧PDO:请记住,Laravel实际上是一个PHP框架!


我的看法:

保持一致性总是有益的:

  • 按照方法(模型+关系定义)进行操作,尽管您可以按照您的建议进行混合和一些。EloquentEloquentQuery Builder

  • 仅使用它也是一致和可能的。Query Builder

我个人更喜欢这个选项。Eloquent


溶液:

狼人 - 阿尔法答案提供了使用这两个选项的极好的解决方案。


推荐