繁体   English   中英

Laravel模型,数据库和pivot表问题

[英]Laravel models, database and pivot tables question

您好,我正在与 Laravel 合作,我必须创建两个简单的模型,比如说商店和书籍。 Stores 可以有一本或多本 Books,Books 可以属于许多 Stores。 当然,我会使用多对多关系,使用 pivot 表。

书籍可能有不同的价格,具体取决于商店。

我认为一个单独的表只会使事情复杂化,在我看来,关联书籍和商店的 pivot 表应该有一个价格列,但 pivot 表只包含 store_id 和 book_id。

我应该创建一个 book_prices 并将其与书籍和商店相关联吗? 什么是最好的方法?

您可以在 pivot 表的迁移中为 pivot 表定义附加列,然后在定义关系时使用withPivot定义附加列,以便它们通过 model:

return $this->belongsToMany(Book::class)->withPivot('price');

(改编自 Laravel 文档,参见https://laravel.com/docs/9.x/eloquent-relationships#retrieving-intermediate-table-columns

您可以自由设置 pivot 表的其他属性。 您可以在文档中阅读更多相关信息。 https://laravel.com/docs/9.x/eloquent-relationships#retrieving-intermediate-table-columns

您必须相应地定义关系,下面应该阐明它是如何工作的。 在此示例中,您使用多对多关系并将价格列添加到每个检索到的 pivot model。

public function books()
{
    return $this->belongsToMany(Book::class)
        ->withPivot('price')
}

例如,您可以像这样在循环中访问 pivot 列

foreach ($shop->books as $book)
{
    echo $book->pivot->price;
}

取决于您的案例的复杂性,但是是的,您有两种选择。 假设 pivot 表被称为book_store

  • 直接将price列添加到book_store 这显然是更简单的选择。 缺点是:

    • 不记录价格变化的历史记录。 如果要保留此历史信息,则必须创建另一个用于记录的表。
    • price所做的更改将直接更改相关book_store记录的价格。 这意味着价格正在“实时”更新,例如,用户现在无法更新价格,但会在一段时间后“发布”价格,就像文档中的示例一样。
  • 创建一个新的不同表来存储价格。 这可能看起来相对更复杂,但它也可能更适合未来。

    • 基本上,在上面的第一个选项中,你会得到 2 个你错过的东西。
    • 不要想太多book_store是一个 pivot 表。 一种查看方式如下: book_store是一个 pivot 表,从booksstores表的角度来看,但它也只是一个普通的 SQL 表,可以使用任何类型的关系与任何其他表相关。
    • 如果你想实现这个,确保在book_store表中创建一个主键。

最后,这完全取决于您的需要。 随时询问您是否需要对此有更多了解。 我希望这有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM