我有一个名为user_ranks
的数据透视表,但我知道它必须是rank_user
。在此表中,我有以下列:
ranker_id
(user_id),car_id
,rank
在users
表中,我有user_id
列,依此类推......
在cars
表中我有car_id
等等......
我想要的是从cars
表中获取所有汽车,并获取avg
表中与每辆车相关的rank
user_ranks
列。
我之前在控制器中做过的事情并没有使用任何模型:
$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
,rank
的数据从1到5 { {1}}和echo "* hard nofile 100000 * soft nofile 100000" | sudo tee --append /etc/security/limits.conf
。它们是静态的,并且不会在那里插入一些数据。
因此,如果没有额外的表格,可以在两个表之间建立汽车及其排名(多对多关系)之间的关系吗?
由于
答案 0 :(得分:0)
我认为你可以这样做:
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" => []
]
]