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 表中获取与每辆汽车相关的avgrank 列。

我之前在控制器中没有使用任何模型的情况是:

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

但是现在我想使用模型,但是(我认为)没有必要这样做,因为在该表中我将拥有 idrank,其中 id 和 @ 的数据都是从 1 到 5 987654338@。它们是静态的,不会在那里插入一些数据。

那么有没有可能在没有额外表的情况下使用两个表在汽车及其等级之间建立关系(多对多关系)?

谢谢

【问题讨论】:

你能显示表的架构吗? users,cars,user_ranks 什么是‍‍ranks表字段? 我没有任何名为 ranks 的表。正如我所说,我在user_ranks 表中有ranker_id(user_id)、car_idrankuser_idusernamepasswordusers 表和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 与数据透视表和关系

Laravel - 数据库、表和列命名约定?

如何从 Laravel 项目中删除所有迁移但保留表和字段

SAP ABAP。取一个透明表数据放到另外一个透明表。并保持数据同步

来自现有表和项目的 laravel 身份验证

在 laravel 中显示来自多个表和外键的数据