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
для пользователей, которые были мягко удалены.
Как сделать так, чтобы эти динамические свойства включали мягкие удаленные элементы?
Очевидно, связанная модель пользователя была удалена, поэтому связанный пользователь не загружен.
Определите отношение, как в приведенном ниже коде, и вы всегда сможете получить пользователя независимо от того, были ли они удалены или нет:
public function user()
{
return $this->belongsTo("App\User")->withTrashed();
}
К сожалению, если вы сделаете это
public function user()
{
return $this->belongsTo("App\User")->withTrashed();
}
вы больше не сможете использовать динамический доступ к пользовательскому отношению, потому что динамический доступ ожидает, что метод отношения возвратит BelongsTo
экземпляр, который возвращает belongsTo
метод Eloquent
учебный класс. Но withTrashed
возвращается Builder
пример.
РЕДАКТИРОВАТЬ
Я был неправ, спасибо @patricius за руководство по правильному пути (в комментариях).