Laravel - 是否可以与一个表和一个数据透视表

时间:2018-06-14 17:48:18

标签: laravel many-to-many relationship

我有一个名为user_ranks的数据透视表,但我知道它必须是rank_user。在此表中,我有以下列:

ranker_id(user_id),car_idrank

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();

但是现在我想使用模型,但是(我认为)没有必要这样做,因为在那个表格中我会idrankidrank的数据从1到5 { {1}}和echo "* hard nofile 100000 * soft nofile 100000" | sudo tee --append /etc/security/limits.conf 。它们是静态的,并且不会在那里插入一些数据。

因此,如果没有额外的表格,可以在两个表之间建立汽车及其排名(多对多关系)之间的关系吗?

由于

1 个答案:

答案 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" => []
  ]
]