我正在与Laravel建立一个场合系统。我有几个表,如:
现在我有一个名为Occasion
的模型,它代表了表格的场合,它还有一个对于occasion_categories表的外键。
我想检索所有场合类别,但
我是否需要为occasion_categories创建一个名为OccasionCategory
的分离模型,并定义这些模型中的所有关系,
或者我可以在Occasion
类中创建方法,例如getCategories()
,然后使用像DB
这样的DB::table('occasion_categories')->get()
类来检索所有可能的类别吗?< / p>
答案 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 Builder或Eloquent: 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')
应该有用。
我不知道这里的最佳做法是什么,但如果你只是问是否可能,那么是的。这两种方法中的一种应该可以正常工作。