编程语言
首页 > 编程语言> > php – 使用Query Builder的Laravel访问器

php – 使用Query Builder的Laravel访问器

作者:互联网

尝试在查询生成器中获取Accessors但抛出错误“Undefined property:stdClass :: $shorcontent”

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

这是带有Accessors的Model文件

<?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'));
}

解决方法:

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

简而言之,DB facade无法访问模型中定义的访问器和mutator.只有模型实例生成的对象才能访问访问器和更改器.

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

但是,Model facade将构建一个查询构建器,但创建的对象的实例将具有访问者和mutator的访问权限,因为它是Article Model类的对象实例.

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

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

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

这将在here进一步解释

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

标签:php,laravel,accessor
来源: https://codeday.me/bug/20190627/1306893.html