Laravel - 定义多个 table 关系
Laravel - define multi table relationships
我是 laravel 的新手,必须为 3 个表定义关系。这些表是事件、类别、包。
活动可以有多个类别,每个类别可以有多个包。相同的类别可以在不同的事件中。
到目前为止,我有以下表格,但不确定我是否采用了正确的方法:
Table:events
id - int
title - varchar ...
Table: categories
id - int
name - varchar
Table:packages
id - int
name - varchar
price - decimal
Table:category_package
category_id - int
package_id - int
Table:event_package
event_id - int
package_id - int
我有内包型号:
public function categories()
{
return $this->belongsToMany('\App\Category');
}
public function events()
{
return $this->belongsToMany('\App\Event');
}
我拥有的内部事件和类别模型:
public function packages()
{
return $this->belongsToMany('\App\Package');
}
当我查询特定事件及其关系时,我想得到以下结果:
[
"events" => [
"id" => 1,
"title" => "whatever title",
"categories" => [
[
"id" => 1,
"name" => "the category",
"packages" => [
["id" => 1, "name" => "pack1"],
["id" => 2, "name" => "pack2"],
["id" => 3, "name" => "pack3"]
]],
[
"id" => 2,
"name" => "second cat",
"packages" => [
["id" => 4, "name" => "pack4"],
["id" => 5, "name" => "pack5"],
["id" => 6, "name" => "pack6"]
]],
]
]
]
这在 laravel 中是否可行,我将如何处理。我很确定我没有采取正确的方法。
谢谢
根据您的 table 结构和您的评论,您似乎想要这样的设置:
- 一个
Event
有多个Packages
- 一个
Package
属于一个Event
- 一个
Category
有多个Packages
- 一个
Package
属于一个Category
您不需要枢轴 tables(category_package
和 event_package
),因此删除它们。然后你的 packages
table 需要添加一个 event_id
和 category_id
字段。
Table:packages
id - int
name - varchar
price - decimal
event_id - int
category_id - int
你应该像这样设置你的模型:
class Event extends Model {
public function packages() {
return $this->hasMany('App\Package');
}
}
class Category extends Model {
public function packages() {
return $this->hasMany('App\Package');
}
}
class Package extends Model {
public function event() {
return $this->belongsTo('App\Event');
}
public function category() {
return $this->belongsTo('App\Category');
}
}
你在问题中尝试获取的数组无法优雅地检索,你必须做一些手动工作,但如果你使用 eager loading with constraints.
并不难
要获得一个 Event
及其 Categories
和 Packages
,您可以这样做:
$event = Event::find($eventId); // Or however you want to get the Event
$event['categories'] = Category::with(['packages' => function($query) use($event) {
$query->where('event_id', $event->id);
}])->get();
要获得多个 Events
及其 Categories
和 Packages
,您只需使用循环并为每个 Event
.
添加类别
$events = Event::all(); // Or however you want to get the Events
foreach ($events as $key => $event) {
$events[$key]['categories'] = Category::with(['packages' => function($query) use ($event) {
$query->where('event_id', $event->id);
}])->get();
}
我是 laravel 的新手,必须为 3 个表定义关系。这些表是事件、类别、包。
活动可以有多个类别,每个类别可以有多个包。相同的类别可以在不同的事件中。
到目前为止,我有以下表格,但不确定我是否采用了正确的方法:
Table:events
id - int
title - varchar ...
Table: categories
id - int
name - varchar
Table:packages
id - int
name - varchar
price - decimal
Table:category_package
category_id - int
package_id - int
Table:event_package
event_id - int
package_id - int
我有内包型号:
public function categories()
{
return $this->belongsToMany('\App\Category');
}
public function events()
{
return $this->belongsToMany('\App\Event');
}
我拥有的内部事件和类别模型:
public function packages()
{
return $this->belongsToMany('\App\Package');
}
当我查询特定事件及其关系时,我想得到以下结果:
[
"events" => [
"id" => 1,
"title" => "whatever title",
"categories" => [
[
"id" => 1,
"name" => "the category",
"packages" => [
["id" => 1, "name" => "pack1"],
["id" => 2, "name" => "pack2"],
["id" => 3, "name" => "pack3"]
]],
[
"id" => 2,
"name" => "second cat",
"packages" => [
["id" => 4, "name" => "pack4"],
["id" => 5, "name" => "pack5"],
["id" => 6, "name" => "pack6"]
]],
]
]
]
这在 laravel 中是否可行,我将如何处理。我很确定我没有采取正确的方法。
谢谢
根据您的 table 结构和您的评论,您似乎想要这样的设置:
- 一个
Event
有多个Packages
- 一个
Package
属于一个Event
- 一个
Category
有多个Packages
- 一个
Package
属于一个Category
您不需要枢轴 tables(category_package
和 event_package
),因此删除它们。然后你的 packages
table 需要添加一个 event_id
和 category_id
字段。
Table:packages
id - int
name - varchar
price - decimal
event_id - int
category_id - int
你应该像这样设置你的模型:
class Event extends Model {
public function packages() {
return $this->hasMany('App\Package');
}
}
class Category extends Model {
public function packages() {
return $this->hasMany('App\Package');
}
}
class Package extends Model {
public function event() {
return $this->belongsTo('App\Event');
}
public function category() {
return $this->belongsTo('App\Category');
}
}
你在问题中尝试获取的数组无法优雅地检索,你必须做一些手动工作,但如果你使用 eager loading with constraints.
并不难要获得一个 Event
及其 Categories
和 Packages
,您可以这样做:
$event = Event::find($eventId); // Or however you want to get the Event
$event['categories'] = Category::with(['packages' => function($query) use($event) {
$query->where('event_id', $event->id);
}])->get();
要获得多个 Events
及其 Categories
和 Packages
,您只需使用循环并为每个 Event
.
$events = Event::all(); // Or however you want to get the Events
foreach ($events as $key => $event) {
$events[$key]['categories'] = Category::with(['packages' => function($query) use ($event) {
$query->where('event_id', $event->id);
}])->get();
}