【问题标题】:Laravel showing the categories of book with pivot table errorLaravel 显示带有数据透视表错误的书籍类别
【发布时间】:2021-07-21 05:28:38
【问题描述】:

我正在学习 Laravel,我有两个表格书籍和类别 我创建了一个带有 book_id 和 category_id 列的数据透视表来建立表之间的关系,但是当我尝试在 show book 页面中显示类别并且我在 $books->categories 上进行 foreach 时,我遇到了一个错误,说foreach 参数为空

Book 模型文件:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Book extends Model
{
    use HasFactory;

    protected $fillable = ['title', 'desc', 'img'];

    public function categories()
    {
        return $this->belongsTo('App\Models\Category');
    }
}

类别模型文件

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Category extends Model
{
    use HasFactory;
    
    protected $fillable = ['name'];

    public function books()
    {
        return $this->belongsTo(Book::class)->withPivot('book_category'); 
    }
}

show.blade 页面:

@extends('layout')

@section('title')
    Book #{{ $book->id }}
@endsection

@section('content')
    <h2>{{ $book->title }}</h2>
    <p>{{ $book->desc }}</p>
    @foreach ($book->categories as $category)
        <span class="text-muted mx-3">{{ $category->name }}</span>
    @endforeach
    <div class="row">
        <div class="col-md-3 p-5">
            <img src="{{ asset('uploads/books') }}/{{$book->img}}" class="w-100">
        </div>
    </div>
    <a href="{{ route('books.index') }}" class="btn btn-primary">Back</a>
    <a href="{{ route('books.edit', $book->id) }}" class="btn btn-warning mx-2">Edit</a>
    <a href="{{ route('books.delete', $book->id) }}" class="btn btn-danger">Delete</a>
@endsection

数据透视表:

the pivot table

BookController 代码:

public function show($id)
    {
        $book = Book::findOrFail($id);

        return view('books/show', compact('book'));
    }

【问题讨论】:

    标签: php laravel pivot backend


    【解决方案1】:

    您可以更改与 belongsToMany 的关系,因为您使用的是数据透视表。

    图书模型中

    public function categories()
    {
        return $this->belongsToMany(Category::class);
    }
    

    Category 模型中

      public function books()
      {
            return $this->belongsToMany(Book::class); 
      }
    

    在你的控制器中

      $book = Book::with('categories')->findOrFail($id);
    

    在你看来是这样

    {{$book->$title}}
    @foreach ($book->categories as $category)
        <span class="text-muted mx-3">{{ $category->name }}</span>
    @endforeach
    

    【讨论】:

    • 我更新了帖子,让你可以看到控制器中的显示功能,我怎样才能修改它与你的一样?
    • Book 查询中的 has 将仅检索至少具有一个类别的书籍,在 belongsToMany 中进行更正后应该返回一个空数组并且不会对 foreach 产生任何问题。
    • @JuanEizmendi 是的,没错。如果它得到了,那么我们有时可能只需要收回那些有类别的书。但是后来更新了帖子,所以在此之前回答了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-27
    • 1970-01-01
    • 2021-04-30
    • 2017-11-01
    • 2018-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多