laravel - Laravel 显示三个有关系的表,一个表连接另外两个表
问题描述
我有 3 张桌子;
Sizes - columns: (id, height, width)
Media - columns: (id, media, description)
Price - columns: (id, size_id, media_id, price)
每个尺寸,在媒体表中都有每条记录,但价格取决于每个单独的尺寸和媒体。
我的目标是像这样显示每种尺寸和媒体及其价格;
8x10 - Media 1 - $20.00
8x10 - Media 2 - $24.00
8x10 - Media 3 - $30.00
8x12 - Media 1 - $24.00
8x12 - Media 2 - $28.00
8x12 - Media 3 - $32.00
到目前为止我尝试过的是(尺寸模型):
public function media() {
return $this->hasManyThrough('\App\Size', '\App\Prices');
}
public function prices() {
return $this->hasManyThrough('\App\Size', '\App\Prices');
}
不使用关系,我可以这样做;
$s = Size::all();
foreach ($s as $size) {
$m = Media::all();
foreach ($m as $media) {
$p = Price::where('enlarge_size_id', '=' , $size['id'])->where('enlarge_media_id', '=', $media['id'])->first();
echo $size['height'] . 'x' . $size['width'] . ' -> ' . $media['media'] . ': $' . $p['price'] . '<br />';
}
}
这可能与 Laravel 中的关系有关吗?我只是在寻找一种更简洁的方法来查看、更新和添加。
解决方案
在您的情况下,您应该使用多对多关系
首先定义与媒体表具有多对多关系的 Size 模型:
class Size extends Model
{
public function media() {
return $this->belongsToMany(Media::class ,'Price', 'size_id', 'media_id')->withPivot('price');
}
}
然后为与尺寸表的关系定义媒体模型:
class Media extends Model
{
public function sizes() {
return $this->belongsToMany(Size::class ,'Price', 'media_id', 'size_id')->withPivot('price');
}
}
如果您想访问数据透视表中的价格列,您可以在相关模型中使用数据透视道具,例如:
$sizes=Size:with('media')->first();
foreach ($sizes->media as $media){
$price=$media->pivot->price
}
推荐阅读
- python - 除了使用多个临时文件之外,还有更好的方法来临时存储文本文件的大量输出数据(放在列和行中)吗?
- python - 如何使用 Pandas 在两个不同的单词之间填充?
- java - 从 Intelli-J 构建 jar 不会执行
- python - 第一次迭代后我的模型精度保持不变(0.024),我该怎么办?
- android - 如何在片段的recyclerview中搜索arraylist数据
- apache-nifi - How to send updated data from java program to NiFi?
- php - 在 Yii2 中将 ActiveRecord 属性映射到 PHP 类
- haskell - 如何删除自定义haskell show功能中的“Just”
- javascript - 计算估计的旅行时间谷歌地图
- javascript - 无论如何,我可以根据 HTML 表上显示的年份创建一个 if 语句来比较另一年吗?