laravel hasOneThrough с мусором не удаляет мягкое удаление промежуточного - PullRequest
0 голосов
/ 18 апреля 2020

Как получить все реляционные записи временных интервалов, когда промежуточное (hasOneThrough) имеет мягкое удаление.

1. Модель посещаемости Attendance.php

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Attendance extends Model
{

    protected $fillable = [
        'tutor_id',
        'center_timeslot_id',
        // other attributes are ommited
    ];

    public function timeslot()
    {
        return $this->hasOneThrough(
            Timeslot::class,
            CenterTimeslot::class,
            'id',
            'id', // primary key on timeslots table...
            'center_timeslot_id', //local key of this table to primary of centerTimeslots table
            'timeslot_id' //local key on centertimeslots table of target table timeslot
        )
        ->withTrashed();//this does not work
    }
}

2. Модель CenterTimeslot CenterTimeslot.php

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class CenterTimeslot extends Model
{
    use SoftDeletes;
    protected $fillable = [
        'center_id', 'timeslot_id', 'capacity'
        // other attributes are ommited
    ];

    public function timeslot()
    {
        return $this->belongsTo(Timeslot::class);
    }
}

3. Наконец, модель таймслота Timeslot.php

<?php

namespace App\Models;

use Carbon\Carbon;
use Illuminate\Database\Eloquent\Model;

class Timeslot extends Model
{
    protected $fillable = [
        'name',
        // other attributes are ommited

    ];
}

Так что, если какая-либо запись мягко удалено, то есть в center_timeslot_table мы не можем получить модель, хотя применяем withTrashed(), так как она работает только на прямой модели в сквозной таблице. Таким образом, мягкое удаление все еще применяется, как определено в модели CenterTimeslot. Таким образом, нет способа получить записи.

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

public function timeslot()
    {
        return $this->hasOneThrough(
            Timeslot::class,
            CenterTimeslot::class,
            'id',
            'id', // primary key on timeslots table...
            'center_timeslot_id', //local key of this table to primary of centerTimeslots table
            'timeslot_id' //local key on centertimeslots table of target table timeslot
        )
        ->withTrashed()
        ->orWhere(function ($query) {
            $query->whereNotNull('center_timeslots.deleted_at');
        });

Это возвращает запись, но я не удовлетворен взломом. Так что, если кто-то может дать немного света или лучший обходной путь, будет хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...