前提・実現したいこと
Laravelで図書館で借りた本をユーザが確認できる様なものを作成しています。
リレーション定義に関しては以前の質問で解決することができたのですが、借りた履歴を引っ張ってきたのですが、借りた時間を取得したいにも関わらず、その本が投稿(追加された)時間のcreated_at
が表示されてしまいます。
phpMyAdminで確認したところ、借りた時間はレコードに挿入されていました。
抽出したいカラムに関して
借りた時間というのは実際には借りた際にpostでレコードが挿入されますので、
create_bookテーブル(create_book_user_table.php)にあるtimestamps
でcreated_at
を表しています。
該当のソースコード
PHP
1 $rent_books = User::with(['books' => function($q){ 2 $q->where('book_user.created_at', '>', date('Y-m-d')); 3 }])->latest()->get(); 4 $rent_book = $rent_book[0]['books'];
試したこと
別の変数で直接 table('book_user')
でレコードを指定してみたのですが、これではリレーションを活用できていないという点と、コード的にも見通しが悪くなってしまうと思いましたので、質問をさせていただきました。
補足情報(FW/ツールのバージョンなど)
Laravel 7.28.1
PHP 7.X
MySQL
create_users_table.php
PHP
1 $table->id(); 2 $table->string('name'); 3 $table->string('email')->unique(); 4 $table->timestamp('email_verified_at')->nullable(); 5 $table->string('password'); 6 $table->rememberToken(); 7 $table->timestamps();
create_book_user_table.php
PHP
1 $table->id(); 2 $table->unsignedBigInteger('user_id'); 3 $table->unsignedBigInteger('book_id'); 4 $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); 5 $table->foreign('book_id')->references('id')->on('books')->onDelete('cascade'); 6 $table->timestamps();
create_book_table.php
$table->id(); $table->char('book_name'); $table->bigInteger('book_price'); $table->text('book_detail'); $table->timestamps();
App\User.php
PHP
1<?php 2 3namespace App; 4 5use Illuminate\Contracts\Auth\MustVerifyEmail; 6use Illuminate\Foundation\Auth\User as Authenticatable; 7use Illuminate\Notifications\Notifiable; 8 9class User extends Authenticatable 10{ 11 use Notifiable; 12 13 /** 14 * The attributes that are mass assignable. 15 * 16 * @var array 17 */ 18 protected $fillable = [ 19 'name', 'email', 'password', 20 ]; 21 22 /** 23 * The attributes that should be hidden for arrays. 24 * 25 * @var array 26 */ 27 protected $hidden = [ 28 'password', 'remember_token', 29 ]; 30 31 /** 32 * The attributes that should be cast to native types. 33 * 34 * @var array 35 */ 36 protected $casts = [ 37 'email_verified_at' => 'datetime', 38 ]; 39 40 public function books(){ 41 return $this->belongsToMany("App\Book")->withTimestamps(); 42 } 43 44}
App\Book.php
PHP
1 <?php 2 3 namespace App; 4 5 use Illuminate\Database\Eloquent\Model; 6 7 class Book extends Model 8 { 9 protected $table = "books"; 10 11 protected $fillable = [ 12 'book_name', 'book_price', 'book_detail', 13 ]; 14 15 public function users(){ 16 return $this->belongsToMany("App\User"); 17 } 18 }
追記
DB::table~latest();
だと単一のプロパティではないのか以下の様なエラーとなる。
Property [books] does not exist on the Eloquent builder instance.
回答1件
あなたの回答
tips
プレビュー