Laravel - 是不是可以与一个表和一个数据透视表建立多对多关系
Posted
技术标签:
【中文标题】Laravel - 是不是可以与一个表和一个数据透视表建立多对多关系【英文标题】:Laravel - Is it possible to have many-to-many relationship with one table and a pivot tableLaravel - 是否可以与一个表和一个数据透视表建立多对多关系 【发布时间】:2018-11-24 13:39:44 【问题描述】:我有一个名为 user_ranks
的数据透视表,尽管我知道它必须是 rank_user
。在此表中,我有这些列:
ranker_id
(user_id), car_id
, rank
在users
表中我有user_id
列等等...
在cars
表中我有car_id
等等...
我想要的是从cars
表中获取所有汽车,并在user_ranks
表中获取与每辆汽车相关的avg
的rank
列。
我之前在控制器中没有使用任何模型的情况是:
$car = \DB::table('cars')
->selectRaw('*, AVG(user_ranks.rank) rank_avg, car.car_id car_id')
->join('users', 'users.user_id', 'car.user_id')
->leftJoin('user_ranks', 'user_ranks.car_id', 'cars.car_id')
->where('cars.car_id', $carId)
->groupBy('cars.car_id')
->first();
但是现在我想使用模型,但是(我认为)没有必要这样做,因为在该表中我将拥有 id
、rank
,其中 id
和 @ 的数据都是从 1 到 5 987654338@。它们是静态的,不会在那里插入一些数据。
那么有没有可能在没有额外表的情况下使用两个表在汽车及其等级之间建立关系(多对多关系)?
谢谢
【问题讨论】:
你能显示表的架构吗?users
,cars
,user_ranks
什么是ranks
表字段?
我没有任何名为 ranks
的表。正如我所说,我在user_ranks
表中有ranker_id
(user_id)、car_id
、rank
、user_id
、username
、password
在users
表和car_id
、@987654 cars
表。谢谢@Alihosseinshahabi
【参考方案1】:
我认为你可以这样做:
Car
模式:
namespace App;
use Illuminate\Database\Eloquent\Model;
class Car extends Model
protected $tables='cars';
public function ranks()
return $this->hasMany(UserRanks::class,'car_id','car_id');
UserRanks
型号:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class UserRanks extends Model
protected $table='user_ranks';
你的controller
:
# get all cars with their ranks
$cars=Car::with(['ranks'=>function($query)
$query->select('car_id','rank');
])->get();
# added `avg_ranks` field to result
$cars->each(function ($item, $key)
$item->avg_ranks=$item->ranks->avg('rank');
);
#print result
dd($cars->toArray());
结果:
array:2 [▼
0 => array:4 [▼
"car_id" => 1
"car_code" => "1111"
"avg_ranks" => 4.5
"ranks" => array:2 [▶]
]
1 => array:4 [▼
"car_id" => 2
"car_code" => "2222"
"avg_ranks" => null
"ranks" => []
]
]
【讨论】:
以上是关于Laravel - 是不是可以与一个表和一个数据透视表建立多对多关系的主要内容,如果未能解决你的问题,请参考以下文章
Laravel Eloquent group by 与数据透视表和关系