Как получить все реляционные записи временных интервалов, когда промежуточное (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');
});
Это возвращает запись, но я не удовлетворен взломом. Так что, если кто-то может дать немного света или лучший обходной путь, будет хорошо.