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

时间:2014-06-24 01:11:17

标签: php laravel model laravel-4 eloquent

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

  • 场合
  • occasion_categories(汽车,三轮车和其他)

现在我有一个名为Occasion的模型,它代表了表格的场合,它还有一个对于occasion_categories表的外键。

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

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

  • 或者我可以在Occasion类中创建方法,例如getCategories(),然后使用像DB这样的DB::table('occasion_categories')->get()类来检索所有可能的类别吗?< / p>

4 个答案:

答案 0 :(得分:7)

实际上,如果您使用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');
    }
}

现在,您可以使用以下内容检索具有它的父级occasion_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网站上的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

答案 1 :(得分:6)

执行数据库的laravelish方法是使用Query BuilderEloquent Laravel 是一个框架,利用它公开的资源总是有意义的。


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

答案简短:

  
      
  • 不,只要您不使用它就不会   的即可。
  •   

答案很长:

  
      
  • 如果您仍想坚持,查询构建器是您的选择   laravel convention。

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

  •   

我的看法:

总是奖励保持一致

  • Eloquent方式(模型+关系定义)执行此操作,尽管您可以按照建议混合Eloquent和某些Query Builder

  • 使用Query Builder专门执行此操作也是一致且可能的。

我个人偏好转到Eloquent选项。


解决方案:

WereWolf - Alpha answer使用这两个选项提供了出色的解决方案。

答案 2 :(得分:1)

只是想在这里加上更新。

在这个特定的例子中,我不确定事情是否发生了变化(可能是错误的,总是更多地发现),但在多对多关系的情况下,一对一的关系由于 pivot()方法,表和模型之间的关系被破坏了。

从我自己的一个项目中获取:

public function fees()
{
    return $this->belongsToMany(Service::class)->withPivot("description");
}

通过这种方式,您可以拥有两个模型(“费用”和“服务”),但您可以访问中间表上的数据,而无需“ServiceFee”模型。

在刀锋中:

{{ $service->pivot->description }}

乍一看,这看起来似乎微不足道,但获得足够的多对多关系,数字表甚至可以超过模型的数量。 (这个假设情景是否必须精心设计,我很遗憾没有时间去思考。)

答案 3 :(得分:0)

虽然我不是肯定的,但我相信这会奏效。或者,DB::raw('select * from occasion_categories')应该有用。

我不知道这里的最佳做法是什么,但如果你只是问是否可能,那么是的。这两种方法中的一种应该可以正常工作。