【问题标题】:Lavavel Scheme to handle Properties and Rooms?处理属性和房间的 Lavavel 方案?
【发布时间】:2021-05-16 13:12:24
【问题描述】:

我不确定如何最好地构建我的表,以便存储和查询高效且简单..

这就是我所拥有的:

  • rooms 表 - 包含 10 多种不同的房间类型(厨房、休息室等),(具有唯一 ID)
  • properties_rooms 查找表 - 属性 ID 和 Room_id
  • properties 表 - 包含许多不同的属性(具有唯一 ID)

除了上述之外,我还需要能够为每个属性/房间组合捕获特定的注释和级别属性,例如:

  • (属性 ID - '1')-> 来自属性表
  • (属性名称 -'Sunny House')-> 来自属性表
  • (房间 ID - '2')-> 来自 properties_rooms 查找
  • (房间名称 - '卧室')-> 来自房间表
  • (级别 - “一楼”)-> 什么桌子??
  • (注 - “双床”)-> 什么桌子??

上面的 Level 和 Note 是特定于属性和房间类型的组合,所以在查找中似乎有意义?

我有以下方案设置:

属性

Schema::create('properties', function (Blueprint $table) {
   $table->id();
   .....

房间和属性_房间

Schema::create('rooms', function (Blueprint $table) {
     $table->id();
     $table->string('name')->unique();
     $table->timestamps();
});

Schema::create('properties_room', function (Blueprint $table) {
     $table->id();
     $table->foreignId('properties_id')->constrained('properties')->onDelete('cascade');
     $table->foreignId('room_id')->constrained('rooms')->onDelete('cascade');
     $table->string('level');
     $table->string('note');
     $table->timestamps();
     $table->unique(['properties_id','room_id']);
});

模型

Rooms
public function properties()
{
     return $this->belongsToMany(Properties::class);
}

Properties
public function rooms()
{
     return $this->belongsToMany(Room::class);
}

“级别”和“注释”字段在查找文件中似乎是正确的。但我不确定这是否正确,或者如何访问它们?

在我的刀片视图中,这些都有效:

  • {{ $properties }} - 属性表属性
  • {{ $properties->rooms }} - 房间表属性

但是通过“房间”属性,我看不到查找文件中保存的信息,这显然是使用过的?

【问题讨论】:

  • 一个Room可以属于多个Properties?
  • withPivot() 可以帮助您从联结表中获取更多详细信息
  • 谢谢哈立德。我认为 withPivot() 是我需要的。 Unflux,是的,房间只是一种类型。因此该类型可能属于许多属性。该房间的具体情况、级别和属性,然后在联结/查找/数据透视表中捕获..

标签: php laravel database-design eloquent


【解决方案1】:

您的 privot 表似乎没有增加任何有价值的东西,所以我打算将您的 Room 特定数据放在 Room 表上并与 Property 建立关系。

属性类

public function rooms()
{
  return $this->hasMany(Room::class);
}

房间类

public function property()
{
  return $this->belongsTo(Property::class);
}

客房桌

Schema::create('rooms', function (Blueprint $table) {
    $table->id();
    $table->string('name');
    $table->string('floor');
    // etc ...
    $table->foreignId('property_id')->constrained();
    $table->timestamps();
});

更新

我可能误解了您的情况,但是,鉴于所提供的信息,我仍然认为数据透视表会增加不必要的组件/复杂性。一个Room 不属于多个Property,它存在于一个Property 中。枢轴还添加了一个额外的连接,可以通过组合您的表来避免。

从您的数据透视表中获取有关 Room 的信息,并将其添加到您的 rooms 表中,同时将 foriegn key 添加到相关的 Property 中(见上文)。您可以添加任何描述Room 的内容(例如,建筑面积,如果它有套房等)。当然,您可能会在 rooms 表中获得一些仅对特定 Room type 有意义的列,但是,一些空字段不会使世界内爆(只有在除以零时才能实现) .保持简单,不要过于复杂。

关于如何获取properties 和相关rooms 列表的一个非常基本的示例可能如下所示。

return view('properties', [
    'properties' => Property::with('rooms')->paginate(10)
]);

然后在您看来,您可以遍历 properties 和它们的 rooms

@foreach ($properties as $property)
    <h4>{{ $property->name }} has {{ $property->rooms->count() }} @choice('room|rooms', $property->rooms->count())</h4>

    @foreach ($property->rooms as $room)
        <p>{{ $room->type }} is located on the {{ $room->level }} floor</p>
    @endforeach
@endforeach

【讨论】:

  • 这可能会导致房间表中的数据冗余,例如如果房间有厨房和没有厨房的房间,表中将有 2 个条目,以此类推,地板值
  • 只有两张桌子(属性和房间)的主要问题是房间的桌子应该是所有可能房间组合的详尽列表。因此,小型物业会有很多冗余。再加上不确定多个属性想在房间表中记录相同的记录?!查看 withPivot() 选项,这似乎是我需要的。谢谢
  • @BenHolmes 目前您的rooms 表不代表Room,但它代表RoomType(厨房、浴室、卧室)。您的数据透视表更能代表Room,并且该数据可能位于与Property 相关的rooms 表中。是的,两个properties 可以有一个kitchen,但不一样kitchen
  • @unflux。我知道数据透视表中的数据更能代表房间实例。这就是我所希望的。我认为 withPivot() 现在允许我选择访问数据透视表中的信息。但也许使用你提到的关系更干净。出于兴趣,那会是什么样子?
  • @BenHolmes 我更新了我的评论。我不能在已经存在的代码中添加更多代码,但可以对我的推理进行更多解释。
猜你喜欢
  • 2023-04-06
  • 1970-01-01
  • 2018-11-22
  • 2016-07-21
  • 2020-05-13
  • 2010-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多