withTrashed на промежуточной модели отношения hasManyThrough - PullRequest
0 голосов
/ 01 марта 2019

У меня есть 3 класса, связанных следующим образом:

Exhibitor
'- Bills
   '- Tickets

Счета и билеты используют черту SoftDeletes, а в классе экспонента у меня есть такое отношение:

public function tickets()
{
    return $this->hasManyThrough(Ticket::class, Bill::class);
}

Мне нужнополучить все Билеты, включая удаленные (withTrashed), но это также должно включать все удаленные Счета.Проблема в том, что withTrashed применяется только к модели билетов, а не к счетам.

Этот запрос

    $tickets = exhibitor()->tickets()->withTrashed()
        ->where('bills.updated_at', '>=', Carbon::parse($since))
        ->orderBy('tickets.id')
        ->get();

Создает этот SQL

select `tickets`.*, `bills`.`exhibitor_id` from `tickets`
inner join `bills` on `bills`.`id` = `tickets`.`bill_id`
where `bills`.`deleted_at` is null 
and `bills`.`exhibitor_id` = ?
and `bills`.`updated_at` >= ?
order by `tickets`.`id` asc

Принимая во внимание, что яэтот SQL должен быть нужен без "bills. deleted_at is null", например:

select `tickets`.*, `bills`.`exhibitor_id` from `tickets`
inner join `bills` on `bills`.`id` = `tickets`.`bill_id`
where `bills`.`exhibitor_id` = ?
and `bills`.`updated_at` >= ?
order by `tickets`.`id` asc

Но я не вижу никаких вариантов, где я мог бы установить withTrashed () для модели Билла.Я думал, что можно установить запрос обратного вызова для метода hasManyThrough, но в соответствии с API это не поддерживается.Это кажется таким простым, и у меня такое ощущение, что я что-то упускаю, но не могу найти это ...

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

В данный момент это невозможно: https://github.com/laravel/framework/issues/23039

Если вы не возражаете против установки внешнего пакета, вы можете использовать созданный мной пакет: https://github.com/staudenmeir/eloquent-has-many-deep

class Exhibitor extends Model
{
    use \Staudenmeir\EloquentHasManyDeep\HasRelationships;

    public function tickets()
    {
        return $this->hasManyDeep(Ticket::class, [Bill::class])
            ->withTrashed('bills.deleted_at');
    }
}
0 голосов
/ 01 марта 2019

Я бы определил область действия для модели заявок, поскольку запрос становится немного сложнее.

public function scopeBillsSince($query, $since)
    return $query->whereHas('bills', function ($query2) use ($since) {
        return $query2->withThrashed()->where('updated_at', '>=', Carbon::parse($since))
    });
}

Используя эту область теперь вы можете запрашивать заявки следующим образом:

$tickets = exhibitor()->tickets()->withTrashed()->billsSince($since);
...