尝试在null上读取属性"name"

8

类别模型

class Category extends Model
{
use HasFactory;

protected $fillable= ['name','number'];

 public function news(){

    return $this->hasMany(News::class);
}

新闻模型

class News extends Model
{
use HasFactory;

protected $fillable= ['cat_id','title','photo','description','author_id','status'];

 public function category(){
        return $this->belongsTo(Category::class);
    }

  public function author(){
  return $this->belongsTo(Author::class);
    }

作者模型

class Author extends Model
{
use HasFactory;

protected $fillable= ['name','status'];

public function news(){
    return $this->hasMany(News::class);
}

这三个模型之间存在关联。在 news-list.blade.php 中,我希望显示类别名称而不是类别 ID。但是出现了以下错误。

这是我的控制器函数。

  public function news_index(){
    $news= News::with('category')->get();
    return view('News.list',compact('news'));
}

这是我的 Blade 页面。当我输入 $new->category->name 而不是 cat_id 时,出现了错误。

@foreach($news as $new)
            <tr>
                <th scope="row">{{$loop->iteration}}</th>
                <td> {{$new->category->name}}</td>
                <td>  {{$new->title}}</td>
                <td> @if($new->photo)
                        <a href="{{url('storage/images/'.$new->photo)}}" target="_blank" class="btn btn-sm btn-secondary">Görüntüle</a></td>
                @endif
                </td>
                <td>  {{$new->author_id}}</td>
                <td>  {{$new->description}}</td>
                <td>  {{$new->status}}</td>

                <td>
                    <a class="btn btn-danger" onclick="return confirm('Silmek istediğinize emin 
       misiniz?')" href="{{route('news_delete', $new->id)}}"><i class="fa fa-trash"></i></a>
                    <a class="btn btn-primary" href="{{route('news_update',$new->id)}}"><i class="fa 
      fa-pen"></i></a>

                </td>
            </tr>
        @endforeach
 

这是我的新闻迁移表

public function up()
    {
        Schema::create('news', function (Blueprint $table) {
            $table->id();
            $table->unsignedBigInteger('cat_id');
            $table->string('title');
            $table->string('photo');
            $table->longText('description');
            $table->unsignedBigInteger('author_id');
            $table->boolean('status')->default('1');
$table->foreign('cat_id')->references('id')->on('categories')->onDelete('cascade');
            $table->foreign('author_id')->references('id')->on('authors')->onDelete('cascade');
            $table->timestamps();
        });
    }

我猜你在错误地使用with()。 - rameezmeans
1
分类和新闻应该是多对多的关系。 - Tpojka
8个回答

9

在定义分类关系时,需要明确定义类别外键。因为您的类别外键不是category_id;而是cat_id。

例如,您需要在News模型中如下定义类别关系:

public function category()
{
    return $this->belongsTo(Category::class, 'cat_id');
}

5

我曾经遇到同样的问题,解决方法如下:

$new->category->name ?? None'

这将返回所有未定义值的“无”。 - abdennour
1
请在您的答案中添加一些解释,以便其他人可以从中学习。 - Nico Haase
2
在 PHP 8.0 及以上版本中,您可以使用 Null 安全运算符 $new->category?->name - levis

4

我遇到了这个问题,是因为name属性与一个可以为NULL的外键相关联,所以当你调用它时会抛出错误。

你可以通过以下方式避免我刚才提到的特定问题。

Levis在评论中说:对于PHP 8及以上版本,使用null安全运算符

$new->category?->name
  • 使用此方法,如果该字段为空,则可以忽略它,不会在该字段中添加任何内容。

如果您想在PHP 8以下的版本中在字段为空时放置一些特定值,请参考abdennour的建议:

$new->category->name ?? 'None'
  • 使用此方法,当该值为空时,你可以避免将字符串None放入该字段中。

2
<td>{{ $new->category->name ?? 'None' }}</td>

欢迎来到Stack Overflow!请阅读[答案]并[编辑]您的答案,以包含有关此代码实际解决问题的说明。请记住,您不仅要解决问题,还要教育OP和任何未来的读者。 - Adriaan

1
我猜你需要重新编写你的news_index()函数。
public function news_index(){
    $news = News::with(array('category'=>function($query){
            $query->select('id','name');
        }))->get();
    return view('News.list',compact('news'));
}

我希望这个可以起作用。你没有给$news变量赋值并传递到视图中。$new是空的。


我仍然得到相同的错误。我在我的 Blade 中使用这个。{{$new->category->number}}。尝试在 null 上读取属性“name”。 - Emre Ensar Çapcı
声明一个新变量,然后将其传递到视图。$news = News::with(array('category'=>function($query){ $query->select('id','name'); }))->get(); - rameezmeans
1
我已经尝试过那种方法了,但它不起作用。谢谢你的回复。 - Emre Ensar Çapcı

0

请检查您的表格。关系之间必须存在匹配。

例如:
用户表:id、book_id、姓名、电子邮件
书籍表:id、标题、价格等...

在用户表中,例如 book_id 为 5 的记录必须存在于书籍表中,否则关系将丢失并出现空值错误。


0
你可以通过添加条件轻松解决这个问题,例如:
<td> $bew->category?$item->category->name:'-' </td>

这段代码首先会访问你的变量并获取你的数据,如果数据库出现问题,它会显示一个“-”符号,这样你就知道你的数据库有问题了。


0

这样的ID可能不存在。请检查一下ID列。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接