Laravel 关系多对多按外键计数相关数据

Posted

技术标签:

【中文标题】Laravel 关系多对多按外键计数相关数据【英文标题】:Laravel relationship many to many count related data by foreign key 【发布时间】:2020-06-25 05:17:58 【问题描述】:

我的项目中有 3 个模型:

用户型号代码:

<?php

namespace App\Models;

use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;

class User extends Authenticatable

    use Notifiable;

    protected $guarded = [];

    public function professions()
    
        return $this->belongsToMany('App\Models\Profession', 'user_professions');
    

职业型号代码

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Profession extends Model

    protected $guarded = [];

    public function users()
    
        return $this->belongsToMany('App\Models\User', 'user_professions');
    

迁移:

$table->id();
$table->string("name");
$table->timestamps();

用户职业型号代码

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class UserProfession extends Model

    //

迁移:

$table->id();
$table->foreignId('user_id')
  ->constrained()
  ->onDelete('cascade');
$table->foreignId('profession_id')
  ->constrained()
  ->onDelete('cascade');

当我尝试使用此代码时,我会按用户的姓名搜索用户并获得专业名称,然后计算该专业的用户数。

代码:

$query = $request->get("query");
$users = User::where("name", "like", "%".$query."%");
$userIds = $users->get()->pluck("id")->toArray();

$professions = Profession::whereHas("users", function($q) use($userIds) 
    $q->whereIn('id', $userIds);
)->get()->toArray();

我收到错误消息:

Illuminate\Database\QueryException: SQLSTATE[23000]: 完整性 违反约束:1052 where 子句中的列“id”不明确 (SQL:从存在的职业中选择*(从用户中选择* 内部加入 user_professions on users.id = user_professions.user_id 其中professions.id = user_professions.profession_id 和 id in (11, 43, 82)))

我的代码哪里有错误,我该如何解决?

【问题讨论】:

$q-&gt;whereIn('id', $userIds); 你需要问自己什么id?用户ID? Professions.id? 在我的情况下,$userIds 中的用户 ID。我有逻辑错误? @Avi 因为 laravel 不知道你想要哪个表的id 如何更正我的查询? @TsaiKoga 按照 Laravel 的约定创建表名 profession_user,这样可以省去一些麻烦。检查(也在这里非常)good practice. 【参考方案1】:

usersuser_professionsprofessions 三个表都有 id 列。

你需要指定你想要的表的id:

$professions = Profession::whereHas("users", function($q) use($userIds) 
    $q->whereIn('users.id', $userIds); // specify the table name
)->get()->toArray();

【讨论】:

以上是关于Laravel 关系多对多按外键计数相关数据的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 多对多关系计数

Laravel 计数和检索多对多关系

Laravel 4:具有额外关系的多对多

python 外键用法 多对多关系 ORM操作 模板相关

两个多对多相关表之间的Laravel雄辩关系

与同一张表的关系(多对多?) - Laravel