尝试读取 null 和 $book->category?->name 上的属性“name”导致一条记录显示数据,而其他记录未显示此数据(表格已填充)

问题描述 投票:0回答:1

我的 laravel 项目中的书籍和类别存在一对多的问题。

我插入三个数据,其中两个具有相同的类别列值以及所述类别的相应 id。

在我插入第三个数据之前,它很好,但是在我插入第三个数据之后,它显示尝试读取空值上的属性“名称”,我尝试

$book->category?->name
导致之前的两个数据出现了类别名称,但没有出现第三个,是我的关系代码有问题还是什么?

localhost of database table - books

laravel books table blade - third record not show/null on category

类别.php

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;
use App\Models\Book;

class Categories extends Model
{
    use HasFactory;
    public function book(): HasMany
    {
        return $this->hasMany(Book::class, 'category');
    }
    protected $fillable = [
        'name',
    ];
}

Book.php

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use App\Models\User;
use App\Models\Rent;
use App\Models\Categories;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Relations\BelongsTo;

class Book extends Model
{
    use HasFactory;
    public function categories(): belongsTo
    {
        return $this->belongsTo(Categories::class, 'id');
    }
    protected $fillable = [
        'book_code',
        'book_title',
        'author',
        'category',
        'publisher',
        'stock',
        'book_cover',
        'book_desc',
        'barcode',
    ];
}

book/index.blade.php

@foreach ($book as $book)
                    <tr>
                        <td><img src="/{{ $book->book_cover }}" width="100px"></td>
                        <td>{{ $book->book_title }}</td>
                        <td>{{ $book->categories?->name }}</td>
                        <td>{{ $book->stock }}</td>
                        <td>
                            <form action="{{ route('book.destroy',$book->id) }}" method="Post">
                            <a class="btn btn-success" href="{{ route('book.show',$book->id) }}">Detail</a>    
                            <a class="btn btn-warning" href="{{ route('book.edit',$book->id) }}">Edit</a>
                                @csrf
                                @method('DELETE')
                                <button type="submit" class="btn btn-danger">Hapus</button>
                            </form>
                        </td>
                    </tr>
                    @endforeach

我的代码是否有问题,导致类别名称记录显示在图书插入的第一条和第二条记录上,但没有显示在图书的第三条记录上?

php laravel laravel-blade relational-database one-to-many
1个回答
0
投票

从尝试开始

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

接下来我建议使用category_id而不是id作为外键

这是假设这本书只有 1 个类别

© www.soinside.com 2019 - 2024. All rights reserved.