提问人:miken32 提问时间:6/1/2016 最后编辑:jedrzej.kurylomiken32 更新时间:6/1/2016 访问量:925
模型上的 SoftDelete 会破坏动态属性
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
这会导致抛出异常,“正在尝试获取非对象的属性”,其行号与我尝试为已软删除的用户输出的位置相对应。$post->user->name
如何让这些动态属性包含软删除的项目?
答:
6赞
jedrzej.kurylo
6/1/2016
#1
显然,相关的用户模型已被软删除,这就是未加载相关用户的原因。
像下面的代码一样定义关系,你将始终能够获取用户,无论他们是否已被软删除:
public function user()
{
return $this->belongsTo("App\User")->withTrashed();
}
0赞
huuuk
6/1/2016
#2
不幸的是,如果你这样做
public function user()
{
return $this->belongsTo("App\User")->withTrashed();
}
您将无法再使用对用户关系的动态访问,因为动态访问要求关系方法返回 instance,而 instance 将按类的方法返回。但返回 instance。BelongsTo
belongsTo
Eloquent
withTrashed
Builder
编辑
我错了,感谢@patricius被引导走上正确的道路(在评论中)。
评论
1赞
patricus
6/1/2016
这是不正确的。 将返回一个对象。然后,当您调用该对象时,它将落入扩展对象上的方法中。该方法将调用基础对象,但它会将对象返回给原始调用方。因此,将返回一个对象。$this->belongsTo("App\User")
BelongsTo
withTrashed()
BelongsTo
__call()
Relation
__call()
withTrashed()
Builder
BelongsTo
$this->belongsTo("App\User")->withTrashed();
BelongsTo
0赞
huuuk
6/1/2016
@patricus,谢谢你的解释,我现在不知道该怎么办。应该编辑/删除我的答案还是保持原样?
0赞
patricus
6/1/2016
轮到你了。尽管评论提供了有用的信息,但有些人并没有进入评论,而只是阅读了答案。您可以删除您的答案,也可以对其进行编辑以表明它不正确,并且您只是由于评论中的有用信息而保留它。如果您决定保留这些信息,我们非常欢迎您将这些信息添加到您的答案中。
上一个:查询对象之间的间接关系
评论