TLDR:当我的父模型中包含SoftDeletes
特征时,我不再将父模型的软删除实例作为子动态属性获取。怎么办呢?
我定义了几个基本模型,如下所示:
<?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
这导致抛出异常,&#34;试图获取非对象的属性&#34;使用与我尝试为已被软删除的用户输出$post->user->name
的位置相对应的行号。
如何让这些动态属性包含软删除的项目?
答案 0 :(得分:5)
显然相关用户模型已被软删除,这就是未加载相关用户的原因。
在下面的代码中定义关系,无论是否被软删除,您都可以随时获取用户:
public function user()
{
return $this->belongsTo("App\User")->withTrashed();
}
答案 1 :(得分:0)
不幸的是,如果你这样做
public function user()
{
return $this->belongsTo("App\User")->withTrashed();
}
您将不再可以使用对用户关系的动态访问,因为动态访问期望关系方法返回BelongsTo
实例,该实例通过belongsTo
类的Eloquent
方法返回。但withTrashed
会返回Builder
个实例。
修改强>
我错了,感谢@patricius在正确的道路上引导(在评论中)。