Laravel 5.5 принадлежит многим с условиями поворота - PullRequest
0 голосов
/ 04 января 2019

У меня есть три модели, Clinic, Department и ClinicDepartment, и отношение belongsToMany называется departments от Clinic до Department с использованием таблицы ClinicDepartment в качестве сводной таблицы, но когда я использую это отношение, области из ClinicDepartment не применяются в запросе.

Я решил сделать модель Pivot вызывающей ClinicDepartmentPivot и применить эти области к Pivot, но не повезло.

Модель клиники:

class Clinic extends Model
{
    use SoftDeletes, ActiveOnly, HasParent;

    public function departments()
    {
        return $this->belongsToMany(Department::class, 'clinic_departments', 'clinic_id', 'department_id')->using(ClinicDepartmentPivot::class);
    }
}

Модель отдела:

class Department extends Model
{
    use SoftDeletes, ActiveOnly;

    public function clinics()
    {
        return $this->belongsToMany(Clinic::class, 'clinic_departments', 'department_id', 'clinic_id')->using(ClinicDepartmentPivot::class);
    }
}

ClinicDepartmentPivot Модель:

class ClinicDepartmentPivot extends Pivot
{
    use ActiveOnly, SoftDeletes;
}

ActiveOnlyScope:

class ActiveOnlyScope implements Scope
{
    public function apply(Builder $builder, Model $model)
    {
        $builder->where($model->getTable() . '.is_active', true);
    }
}

Итак, я хочу применить глобальные области видимости к модели Pivot, поэтому, когда я пытаюсь получить Clinics of Department, он должен проверить - есть ли ClinicDepartment is_active = 1 и не удален.

UPD 1

Мои черты видимости выглядят так:

trait ActiveOnly
{
    public static function bootActiveOnly()
    {
        if (!Auth::guard('admin')->check() && strpos(request()->getRequestUri(), 'admin') === false) {
            static::addGlobalScope(new ActiveOnlyScope);
        }
    }
}

Может использоваться с любой моделью.

Ответы [ 2 ]

0 голосов
/ 10 января 2019

Хорошо, с некоторым решением я наконец нашел рабочее решение, которое не выглядит лоскутным)

public function clinics()
    {
        return $this->belongsToMany(Clinic::class, 'clinic_departments', 'department_id', 'clinic_id')
            ->where(function (Builder $query) {
                $query->where('clinic_departments.is_active', 1)
                    ->whereNull('clinic_departments.deleted_at');
            });
    }

Фактический запрос выглядит так:

select `clinics`.*, `clinic_departments`.`department_id` as `pivot_department_id`, `clinic_departments`.`clinic_id` as `pivot_clinic_id` from `clinics` inner join `clinic_departments` on `clinics`.`id` = `clinic_departments`.`clinic_id` where (`clinic_departments`.`is_active` = 1 and `clinic_departments`.`deleted_at` is null)

Спасибо всем за идеи.

0 голосов
/ 04 января 2019

Вы что-то упускаете здесь:

Чтобы назначить глобальную область видимости модели, вы должны переопределить данный метод загрузки модели и использование метода addGlobalScope

Документы Laravel по объему

Ваши модели должны выглядеть следующим образом:

class Clinic extends Model
{
    use SoftDeletes, ActiveOnly, HasParent;

    protected static function boot()
    {
        parent::boot();

        static::addGlobalScope(new ActiveOnlyScope);
    }

    public function departments()
    {
        return $this->belongsToMany(Department::class, 'clinic_departments', 'clinic_id', 'department_id')->using(ClinicDepartmentPivot::class);
    }
}



class Department extends Model
{
    use SoftDeletes, ActiveOnly;

    protected static function boot()
    {
        parent::boot();

        static::addGlobalScope(new ActiveOnlyScope);
    }

    public function clinics()
    {
        return $this->belongsToMany(Clinic::class, 'clinic_departments', 'department_id', 'clinic_id')->using(ClinicDepartmentPivot::class);
    }
}
...