模型上的 SoftDelete 会破坏动态属性

SoftDeletes on model breaks dynamic properties

提问人:miken32 提问时间:6/1/2016 最后编辑:jedrzej.kurylomiken32 更新时间:6/1/2016 访问量:925

问:

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

如何让这些动态属性包含软删除的项目?

php laravel laravel-5 雄辩 的软删除

评论


答:

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。BelongsTobelongsToEloquentwithTrashedBuilder

编辑

我错了,感谢@patricius被引导走上正确的道路(在评论中)。

评论

1赞 patricus 6/1/2016
这是不正确的。 将返回一个对象。然后,当您调用该对象时,它将落入扩展对象上的方法中。该方法将调用基础对象,但它会将对象返回给原始调用方。因此,将返回一个对象。$this->belongsTo("App\User")BelongsTowithTrashed()BelongsTo__call()Relation__call()withTrashed()BuilderBelongsTo$this->belongsTo("App\User")->withTrashed();BelongsTo
0赞 huuuk 6/1/2016
@patricus,谢谢你的解释,我现在不知道该怎么办。应该编辑/删除我的答案还是保持原样?
0赞 patricus 6/1/2016
轮到你了。尽管评论提供了有用的信息,但有些人并没有进入评论,而只是阅读了答案。您可以删除您的答案,也可以对其进行编辑以表明它不正确,并且您只是由于评论中的有用信息而保留它。如果您决定保留这些信息,我们非常欢迎您将这些信息添加到您的答案中。