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_packageevent_package),因此删除它们。然后你的 packages table 需要添加一个 event_idcategory_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 及其 CategoriesPackages,您可以这样做:

$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 及其 CategoriesPackages,您只需使用循环并为每个 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();
}