模型上的 SoftDeletes 破坏了动态属性
SoftDeletes on model breaks dynamic properties
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
这会导致抛出异常,"Trying to get property of non-object" 行号对应于我尝试为已被软删除的用户输出 $post->user->name
的位置。
如何让这些动态属性包含软删除项?
显然相关用户模型已被软删除,这就是相关用户未加载的原因。
像下面的代码一样定义关系,您将始终能够获取用户,无论他们是否已被软删除:
public function user()
{
return $this->belongsTo("App\User")->withTrashed();
}
不幸的是,如果你这样做了
public function user()
{
return $this->belongsTo("App\User")->withTrashed();
}
您将无法再使用动态访问用户关系,因为动态访问需要关系方法 returns BelongsTo
实例,而 returns 通过 belongsTo
方法Eloquent
class 个。但是 withTrashed
returns Builder
实例.
编辑
我错了,感谢@patricius 在正确的道路上得到指导(在评论中)。
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
这会导致抛出异常,"Trying to get property of non-object" 行号对应于我尝试为已被软删除的用户输出 $post->user->name
的位置。
如何让这些动态属性包含软删除项?
显然相关用户模型已被软删除,这就是相关用户未加载的原因。
像下面的代码一样定义关系,您将始终能够获取用户,无论他们是否已被软删除:
public function user()
{
return $this->belongsTo("App\User")->withTrashed();
}
不幸的是,如果你这样做了
public function user()
{
return $this->belongsTo("App\User")->withTrashed();
}
您将无法再使用动态访问用户关系,因为动态访问需要关系方法 returns BelongsTo
实例,而 returns 通过 belongsTo
方法Eloquent
class 个。但是 withTrashed
returns Builder
实例.
编辑
我错了,感谢@patricius 在正确的道路上得到指导(在评论中)。