Estoy trabajando en una aplicación de biblioteca, y yo quiero crear una función, donde el usuario puede sacar un libro a un cliente. Así que tengo 2 mesas, books
y readers
yo he creado una tabla dinámica, llamada book_reader
así a crear el método de pago. Sin embargo, tengo algunos problemas para mostrar los datos de esta tabla. He leído varios artículos sobre esto, pero no toman en cuenta que hay algunos datos de la tabla dinámica que contiene nueva información y no es sólo la unión de las 2 tablas. Estaría muy agradecida si alguien me podría ayudar con la forma en que puedo mostrar estos datos.
modelos:
<?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",
];
}
migraciones:
<?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>
Su tabla dinámica contiene solamente returndate
y maxreturndate
, así como las marcas de tiempo predeterminados; ¿por qué estás tratando de obtener title
y name
de la propiedad de pivote? Usted no dice cuáles son sus "problemas" son, pero espero que sería uno de ellos.
Vea aquí un ejemplo de esta configuración de trabajo: https://implode.io/1OCqbL
En un plano más general, ya que se ha configurado como la relación de muchos a muchos, a obtener las ventajas de la tabla dinámica. En realidad, el libro no será revisado por más de una persona por lo que podría tener sentido para tener un descriptor de acceso establecido como una especie de pseudo-relación:
public function getReaderAttribute()
{
return $this->readers->first();
}
Ahora se puede hacer referencia a $book->reader->pivot
donde sea apropiado.
Es posible que desee hacer lo mismo con fecha de regreso:
public function getReturndateAttribute()
{
return $this->reader ? $this->reader->pivot->returndate : null;
}
Así que usted puede conseguir fácilmente la fecha de regreso de un libro que de check out.