Laravel отношение многие ко многим подсчитывают связанные данные по внешнему ключу - PullRequest
0 голосов
/ 13 марта 2020

В моем проекте 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();

UserProfession код модели

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

Я получаю сообщение об ошибке:

Подсветка \ База данных \ QueryException: SQLSTATE [23000]: Нарушение ограничения целостности: 1052 Столбец 'id' в выражении where является неоднозначным (SQL: выберите * из профессий, где существует (выберите * из пользовательского внутреннего присоединения user_professions на users.id = user_professions.user_id, где profs.id = user_professions.profession_id и id в (11, 43, 82)))

Где У меня ошибка в моем коде и как я могу это исправить?

1 Ответ

2 голосов
/ 13 марта 2020

Есть три таблицы users, user_professions и professions, у всех из которых есть столбец id.

Вам необходимо указать, какой идентификатор таблицы вам нужен:

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