Отображение данных сводной таблицы - PullRequest
1 голос
/ 15 марта 2020

Я работаю над библиотечным приложением и хочу создать функцию, в которой пользователь может получить книгу для покупателя. Итак, у меня есть 2 таблицы, books и readers, и я создал сводную таблицу, которая также называется book_reader, чтобы создать метод оформления заказа. Однако у меня есть некоторые проблемы с отображением данных из этой таблицы. Я прочитал несколько статей по этому поводу, но они не принимают во внимание, что в сводной таблице есть некоторые данные, которые содержат новую информацию, а не только объединение двух таблиц. Я был бы очень признателен, если бы кто-то мог помочь мне с тем, как я могу отобразить эти данные.

Модели:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Book extends Model
{
    protected $fillable = ['title', 'year', 'language_id', 'isbn', 'pages', 'user_id'];

public function readers()
    {
        return $this
            ->belongsToMany(Reader::class, 'book_reader')
            ->using(Checkout::class)
            ->withPivot(['returndate', 'maxreturndate']);
    }
}

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Reader extends Model
{
    protected $fillable = ['name', 'email', 'employee_number'];

    public function books()
    {
        return $this
            ->belongsToMany(Book::class, 'book_reader')
            ->using(Checkout::class)
            ->withPivot(['returndate', 'maxreturndate']);
    }
}

<?php

namespace App;

use Illuminate\Database\Eloquent\Relations\Pivot;

class Checkout extends Pivot
{
    $table = "book_reader";

    $dates = [
        "maxreturndate",
        "returndate",
    ];
}

Миграции:

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateCheckedOutsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('book_reader', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->bigInteger('book_id')->unsigned();
            $table->foreign('book_id')->references('id')->on('books')->onDelete('cascade');
            $table->bigInteger('reader_id')->unsigned();
            $table->foreign('reader_id')->references('id')->on('readers')->onDelete('cascade');
            $table->date('maxreturndate');
            $table->date('returndate')->nullable();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('book_reader');
    }
}

CheckedOutController:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Book;
use App\Reader;
use Illuminate\Support\Carbon;



class CheckedOutController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        $books = Book::doesntHave("readers")->get();
        $readers = Reader::all();

        return view('checkedouts/index', compact('books','readers'));
    }

index.blade. php:

@foreach($readers->books as $book)
      <tr>
        <td>{{$book->pivot->id}}</td>
        <td>{{$book->pivot->title}}</td>
        <td>{{$book->pivot->name}}</td>
        <td>{{$book->pivot->created_at}}</td>
        <td >{{$book->pivot->maxreturndate}}</td>
        <td>{{$book->pivot->returndate}}</td>
        <td></td>

1 Ответ

0 голосов
/ 15 марта 2020

Ваша сводная таблица содержит только returndate и maxreturndate, а также временные метки по умолчанию; почему вы пытаетесь получить title и name из свойства pivot? Вы не говорите, в чем заключаются ваши «проблемы», но я ожидаю, что это будет одна из них.

Смотрите пример работающей установки: https://implode.io/1OCqbL


В более общем плане, поскольку вы установили отношение «многие ко многим», вы получаете преимущества сводной таблицы. В действительности, ваша книга не будет проверена более чем одним человеком, поэтому может иметь смысл иметь аксессор , настроенный как своего рода псевдосвязь:

public function getReaderAttribute()
{
    return $this->readers->first();
}

Теперь Вы можете обратиться к $book->reader->pivot, где это уместно.

Вы можете сделать то же самое с датой возвращения:

public function getReturndateAttribute()
{
    return $this->reader ? $this->reader->pivot->returndate : null;
}

Таким образом, вы можете легко получить дату возврата книги, которая была проверена из.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...