微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php – 试图获取非对象的属性错误 – Laravel

参见英文答案 > Laravel Foreign Key ‘Trying to get property of non-object’                                    1个
我正在开发一个laravel的博客,我在两个表之间的外键有问题:帖子和类别.

我创建了两个模型:Post(用于posts表)和Category(用于categories表).在我看来,我写了这段代码:< p>张贴于:{{$post-> category-> id}}< / p>,但是显示以下错误

ErrorException: Trying to get property of non-object foreign key error

邮政模式:

class Post extends Model
{
    public function category()
     {
        return $this->belongsTo('App\Category');
    }
}

分类型号:

class Category extends Model
{
    public $table = 'categories';  

    public function posts() 
    { 
        return $this->hasMany('App\Post');
    }
}

查看表格:

@extends('main')

@section('title', "| $post->title " )

@section('content')

    <div class="row">
        <div class ="col-md-8></col-md-8 col-md-offset-2"> 
            <h1>{{$post->title}}</h1>
            <p>{{$post->body}}</p>
            <hr>
            <p>Posted In:{{$post->category->id}}</p>
        </div>
    </div>
@endsection

我希望代码:< p>张贴于:{{$post-> category-> id}}< / p>
将在博客文章输出该类别.

解决方法:

TL; DR

我很确定这必须与Laravel 5.8中的新认值相关,其中主键已从Integer更改为BigInteger.

如果是这样,请从以下位置更改外键列类型:

$table->unsignedInteger('category_id');

至:

$table->unsignedBigInteger('category_id);
                ^^^

说明

在以前版本的Laravel(5.7或更低版​​本)中,这是认行为:

Schema::create('categories', function(Blueprint $table) {
    $table->increments('id'); // <-- so, an 'integer'
    // ...
});

那么在你的其他表中你就是这样做的:

Schema::create('posts', function(Blueprint $table) {
    $table->increments('id');
    $table->unsignedInteger('category_id'); // <-- to match, also an integer
    // or this: $table->integer('category_id')->unsigned();
    // ...
});

但是现在在Laravel 5.8中,认迁移看起来像:

Schema::create('categories', function(Blueprint $table) {
    $table->bigIncrements('id'); // <----- so Now is a BigInteger
    // ...
});

哪个是BigInteger.所以在你的外键中你应该使用这种类型:

Schema::create('posts', function(Blueprint $table) {
    $table->bigIncrements('id');
    $table->unsignedBigInteger('category_id'); // <---- to match, use this
    // or this: $table->bigInteger('category_id')->unsigned();
    // ...
});

查看Povilas Korop的这篇文章Be Careful: Laravel 5.8 Added bigIncrements As Defaults

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐