Получение значения из отношений в отношениях в Laravel 5.8 - PullRequest
2 голосов
/ 30 апреля 2019

Итак, у меня approved_quote отношения на моей jobs модели.

public function approved_quote()
{
    return $this->hasOne(JobQuote::class, 'job_id')->whereNotNull('approved_at');
}

Я хочу отозвать продукты, которые были указаны.Я попробовал несколько методов, однако оба имеют неожиданные результаты.

Попытка 1

public function quoted_job_products()
{
    return $this->hasMany(JobProduct::class, 'job_id')->where('job_quote_id', $this->approved_quote()->first()->id ?? 0);
}

Однако $this->approved_quote->get(); возвращает 14 записей, которые на самом деле не актуальны (или вправо) и поэтому ->first() просто возвращает первое из того, что является неправильным.

Попытка 2

public function quoted_job_products()
{
    return $this->hasMany(JobProduct::class, 'job_id')->where('job_quote_id', $this->approved_quote->id ?? 0);
}

$this->approved_quote возвращает ноль, и поэтомуне работает.

Есть предложения, как этого достичь?(Желательно без approved_quote_id на jobs, однако я буду, если потребуется).

1 Ответ

1 голос
/ 30 апреля 2019

Как насчет разделения этого запроса на более мелкие части?Это не законченное решение, но может быть полезным.Не уверен, что я правильно понял отношения.

Модели

  • Job
  • JobProduct
  • JobQuote

Отношения

  • Job HasOne JobProduct
  • Job HasMany JobQuote
  • JobQuote принадлежит JobProduct

Решение

class Job extends Model {
    public function jobQuotes()
    {
        return $this->hasMany(JobQuote::class);
    }

    public function approvedJobQuote()
    {
        return $this->jobQuotes()->whereNotNull('approved_at')->first()
    }

    public function approvedJobProduct()
    {
        return $this->approvedJobQuote()->jobProduct()
    }
}

И

class JobQuote extends Model {
    public function jobProduct()
    {
        return $this->belongsTo(JobProduct::class);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...