Получение уникальных моделей во вложенных отношениях «многие ко многим» - PullRequest
0 голосов
/ 18 апреля 2020

Привет, друзья, пользователи StackOverflow!

Я борюсь за довольно простую задачу и буду очень рад, если кто-нибудь из вас сможет мне помочь. У меня есть 3 модели с вложенными отношениями «многие ко многим».

Моя первая модель - Wave , которая имеет отношение M2M с Employee :

Wave. php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Wave extends Model
{

    public function employees()
    {
        return $this->belongsToMany('App\Employee');
    }

Сотрудник , у которого есть многие ко многим с Волной и еще один со многими со многими с Экспертиза

Сотрудник. php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Employee extends Model
{

    public function waves()
    {
        return $this->belongsToMany('App\Wave');
    }

    public function expertises()
    {
        return $this->belongsToMany('App\Expertise');
    }


Наконец-то моя Экспертиза модель со многими ко многим с Сотрудник :

Экспертиза. php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Expertise extends Model
{

    public function employees()
    {
        return $this->belongsToMany('App\Employee');
    }

Здесь я бы хотел создать собственное свойство на Wave , чтобы получить все отличные экспертизы , которые сотрудников присвоенный этой волне обладать.

Это выглядело бы как одномерный набор различных экспертиз .

Это не кажется очень сложным, но я перепробовал много вещей и не смог заставить его работать.

Последнее, что я попробовал, это запросил модель Expertise, используя с и с PivotIn , но без успех:

Волна. php


    public function getExpertisesAttribute()
    {
        $employees = $this->employees;
        $expertises = Expertise::with('employees', function($q) use($employees) {
            $q->wherePivotIn('employee_id', $employees->pluck('id')->toArray());
        });
        return $expertises;
    }

При выполнении запроса появляется ошибка:

PHP Warning: mb_strpos() expects parameter 1 to be string, object given in /Users/Kaz/lab/MyProject/vendor/laravel/framework/src/Illuminate/Support/Str.php on line 107

К вашему сведению Я использую Laravel 5.8 на PHP 7.2

Большое спасибо за прочтение этого, и я надеюсь, что вы сможете мне помочь, потому что я чувствую себя немного застрявшим и все еще кажется как легко сделать!

1 Ответ

1 голос
/ 18 апреля 2020

Возможно, вы ищете метод whereHas () из Laravel. Этот метод принудительно возвращает только Expertises, которые имеют отношение employee с теми employees, содержащимися в объекте волны.

Дайте этому попытку. Настройте по мере необходимости, но это должно привести вас туда, где вы будете sh до go:

$employees = $this->employees;
$employees_ids = $employees->pluck('id')->toArray();
$expertises = Expertise::with('employees')->whereHas('employees', function ($query) use ($employees_ids) {
    $query->whereIn('employees.id', $employees_ids);
})->get();

dd($expertises);
...