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

时间:2016-05-31 23:48:40

标签: php laravel laravel-5 eloquent soft-delete

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的位置相对应的行号。

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

2 个答案:

答案 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在正确的道路上引导(在评论中)。