Laravel Eloquent - получите результаты от родителей, у которых только один ребенок - PullRequest
2 голосов
/ 09 ноября 2019

Я пытаюсь получить все результаты, которые соответствуют определенному дочернему идентификатору и которые родитель имеет только для дочернего элемента. Моя первоначальная идея состоит в том, чтобы сделать это вручную с помощью вложенных foreachs, но есть ли метод, который делает это более простым способом?

Мой родительский элемент называется Proyectos, а затем у меня есть сводная таблица с именем PaisBeneficiarioProyecto, а другой родитель - PaisBeneficiario. Это отношение many-to-many.

$monto_pais = Proyecto::all()->where('pais_beneficiarios', $id)->sum('monto_aprobado');

Код, описанный выше, делает то, что вы ожидаете, но это не тот результат, который мне нужен. Вот мои модели:

Proyectos:

public function pais_beneficiarios()
    {
        return $this->belongsToMany(\App\Models\PaisBeneficiario::class, 'pais_beneficiario_proyecto', 'id_proyecto', 'id_pais_beneficiario')
                    ->withPivot('monto_beneficio');
    }

PaisBeneficiario:

public function pais_beneficiario()
    {
        return $this->belongsTo(\App\Models\PaisBeneficiario::class, 'id_pais_beneficiario');
    }

    public function proyecto()
    {
        return $this->belongsTo(\App\Models\Proyecto::class, 'id_proyecto');
    }

PaisBeneficiarioProyectos:

public function proyectos()
    {
        return $this->belongsToMany(\App\Models\Proyecto::class, 'pais_beneficiario_proyecto', 'id_pais_beneficiario', 'id_proyecto')
                    ->withPivot('monto_beneficio');
    }

Значение, которое я пытаюсь суммировать, называется monto_aprobado, которое включено Proyectos

1 Ответ

1 голос
/ 09 ноября 2019

Приведенный ниже запрос дает сумму monto_aprobado поля Proyecto моделей, у которых есть одна pais_beneficiarios_count.

Proyecto::withCount('pais_beneficiarios')
    ->having('pais_beneficiarios_count', 1)
    ->sum('monto_aprobado');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...