使用Query Builder的Laravel访问器

时间:2017-06-30 15:23:38

标签: php laravel accessor

尝试在查询构建器中获取访问者,但抛出错误" Undefined property: stdClass::$shorcontent "

//controller
        public function index(){
        $articles = DB::table('articles')->paginate(10);
        return view('articles.index', ['articles' => $articles], compact('articles'));
    }

以下是带有访问者的模型文件

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Article extends Model
{
    protected $fillable = [
        'user_id', 'content', 'live', 'post_on'
    ];

    protected $guarded = ['id'];

    public function getShortContentAttribute()
    {

        return substr($this->content,0, random_int(60, 150));
    }
}

这是视图

//article/index.blade.php View
<td class="col-md-6">{{ $article->shortcontent }} </td>

当我使用eloquent而不是查询构建器时,相同的代码工作,像这样

public function index()
{
    $articles = Article::paginate(10);
    return view('articles.index', ['articles' => $articles], compact('articles'));
}

2 个答案:

答案 0 :(得分:2)

这个答案很晚,您可能已经找到了解决方案,但希望它可以帮助其他人。

简短回答,数据库外观无法访问模型中定义的访问器和更改器。只有模型实例创建的对象才能访问访问者和变更器。

我认为这里的问题是使用数据库外观仅创建查询生成器而不引用您在文章模型中设置的访问者或更改者。 DB facade仅使用查询构建器查询数据库,并返回独立于文章模型的对象。

但是,Model facade将构建一个查询构建器,但创建的对象的实例将可以访问访问器和mutators,因为它是Article Model类的对象实例。

看看这个SO答案: Difference between DB and Model facade

只有在您尝试从模型实例中检索属性的值时才会访问访问者,例如:

$article = Article::find(1);
$shortContent = $article->short_content;

进一步解释here

因此,如果您希望访问访问者,则必须使用模型外观,即Article::paginate(10)

答案 1 :(得分:2)

您缺少附加short_content属性。只需添加此

namespace App;

use Illuminate\Database\Eloquent\Model;

class Article extends Model
{

protected $fillable = [
    'user_id', 'content', 'live', 'post_on'
];
protected $appends = ['short_content'];
protected $guarded = ['id'];

public function getShortContentAttribute()
{

return substr($this->content,0, random_int(60, 150));

}

}