[英]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
记录的价格。 这意味着价格正在“实时”更新,例如,用户现在无法更新价格,但会在一段时间后“发布”价格,就像文档中的示例一样。创建一个新的不同表来存储价格。 这可能看起来相对更复杂,但它也可能更适合未来。
book_store
是一个 pivot 表。 一种查看方式如下: book_store
是一个 pivot 表,从books
和stores
表的角度来看,但它也只是一个普通的 SQL 表,可以使用任何类型的关系与任何其他表相关。book_store
表中创建一个主键。最后,这完全取决于您的需要。 随时询问您是否需要对此有更多了解。 我希望这有帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.