SoftDeletes на модели нарушает динамические свойства

TLDR: когда SoftDeletes trait включен в мою родительскую модель, я больше не получаю мягкие удаленные экземпляры родительской модели как динамическое свойство дочернего объекта. Как это может быть сделано?


Я определил пару основных моделей, например:

<?php
namespace App;

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

class User extends Model
{
use SoftDeletes;

public function posts()
{
return $this->hasMany("App\Post");
}
}

class Post extends Model
{
public function user()
{
return $this->belongsTo("App\User");
}

public function scopePending(Builder $query)
{
return $query->whereNull("pending");
}
}

В моем контроллере я хочу перечислить ожидающие сообщения, поэтому я делаю это:

<?php
namespace App\Controllers;

use App\Post;

class PostController extends Controller
{

public function index()
{
$posts = Post::pending()->get();
return view("post.index", ["pending"=>$posts]);
}
}

И наконец, на мой взгляд:

@foreach($pending as $post)
{{ $post->title }}<br/>
{{ $post->user->name }}<br/>
@endforeach

В результате выдается исключение «Попытка получить свойство необъекта» с номером строки, соответствующим тому, где я пытаюсь вывести $post->user->name для пользователей, которые были мягко удалены.

Как сделать так, чтобы эти динамические свойства включали мягкие удаленные элементы?

2

Решение

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

Определите отношение, как в приведенном ниже коде, и вы всегда сможете получить пользователя независимо от того, были ли они удалены или нет:

public function user()
{
return $this->belongsTo("App\User")->withTrashed();
}
5

Другие решения

К сожалению, если вы сделаете это

public function user()
{
return $this->belongsTo("App\User")->withTrashed();
}

вы больше не сможете использовать динамический доступ к пользовательскому отношению, потому что динамический доступ ожидает, что метод отношения возвратит BelongsTo экземпляр, который возвращает belongsTo метод Eloquent учебный класс. Но withTrashed возвращается Builder пример.

РЕДАКТИРОВАТЬ

Я был неправ, спасибо @patricius за руководство по правильному пути (в комментариях).

0

По вопросам рекламы [email protected]