質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

2236閲覧

Laravel リレーション定義したデータを抽出する際に関して

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2020/09/19 09:09

編集2020/09/19 14:02

前提・実現したいこと

Laravelで図書館で借りた本をユーザが確認できる様なものを作成しています。
リレーション定義に関しては以前の質問で解決することができたのですが、借りた履歴を引っ張ってきたのですが、借りた時間を取得したいにも関わらず、その本が投稿(追加された)時間のcreated_atが表示されてしまいます。
phpMyAdminで確認したところ、借りた時間はレコードに挿入されていました。

抽出したいカラムに関して

借りた時間というのは実際には借りた際にpostでレコードが挿入されますので、
create_bookテーブル(create_book_user_table.php)にあるtimestampscreated_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.

しかし、なぜかfirst()とすることで取得できた。
取得結果
イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

phper.k

2020/09/19 10:13

データベースの定義と、モデルを提示してください。
退会済みユーザー

退会済みユーザー

2020/09/19 10:35

ありがとうございます。追記しました。
phper.k

2020/09/19 10:47 編集

users の定義が重複しています。 book_user の定義も忘れずに
退会済みユーザー

退会済みユーザー

2020/09/19 10:50

失礼しました。 修正しましたのでご確認していただけると幸いです
phper.k

2020/09/19 10:51

「借りた時間」はどのテーブルのどのカラムですか?
退会済みユーザー

退会済みユーザー

2020/09/19 10:54

借りた時間との表現でしたが、実際には借りた際にpostでレコードが挿入されますので、 create_bookテーブル(create_book_user_table.php)のtimestampsでcreated_atを表しています。
phper.k

2020/09/19 10:57 編集

質問文にその情報を含めてください。 検索してきた同様の問題を持ってきた人のために。
退会済みユーザー

退会済みユーザー

2020/09/19 10:58

わかりました。ありがとうございます。
guest

回答1

0

ベストアンサー

イメージ説明

php

1$user = User::with(['books'])->latest(); 2foreach ($user->books as $book) { 3 dump($book->pivot->created_at); 4 dump($book->book_name); 5}

投稿2020/09/19 11:08

編集2020/09/19 11:18
phper.k

総合スコア3923

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

phper.k

2020/09/19 11:08

前回の質問の回答と同じところに書かれています。
退会済みユーザー

退会済みユーザー

2020/09/19 11:15

Property [books] does not exist on this collection instance. となってしまいます。
退会済みユーザー

退会済みユーザー

2020/09/19 11:15

> 前回の質問の回答と同じところに書かれています。 すいません。いまいちドキュメントの部分で記述されている説明がわからずそのまま読み進めてしまいました。
phper.k

2020/09/19 11:18 編集

> Property [books] does not exist on this collection instance. となってしまいます。 修正しました
退会済みユーザー

退会済みユーザー

2020/09/19 11:27

Property [books] does not exist on the Eloquent builder instance. と今度はなってしまいました。 そこで $user = User::with(['books'])->first(); としたところ取得できたのですが、これでは問題でしょうか?
phper.k

2020/09/19 11:29

問題かどうかはご自身で判断するしかないでしょう。 私は仕様を知りませんから。
退会済みユーザー

退会済みユーザー

2020/09/19 11:32

ありがとうございます。 日本語の問題なのかドキュメントで理解が難しいところが数多くありますが、1つずつ読み進めていきます
phper.k

2020/09/19 11:33

ほんと、ドキュメントに書いてあるので、質問の前にしっかり読んでください。
phper.k

2020/09/19 11:36 編集

first() だと、最初に追加されたユーザーという意味になりますが、それでいいということですよね?
退会済みユーザー

退会済みユーザー

2020/09/19 11:49

latest()にしたところ Property [books] does not exist on the Eloquent builder instance. になってしまったため、修正した次第です。 App\User.php では以下の様に追記しました。 public function books(){ return $this->belongsToMany("App\Book")->withTimestamps(); }
phper.k

2020/09/19 11:51 編集

そこだけ抜き出されても判断つかないです。
退会済みユーザー

退会済みユーザー

2020/09/19 11:58

Laravelのドキュメントがあまり理解できないというのは技術的な問題なのでしょうか?
phper.k

2020/09/19 12:05 編集

質問者たちを観測している限り、正直人それぞれ。 共通しているのは文章をよく読んでいない。 「書かれていることを書いてある通りに理解していない」と感じます。 あなたのことというより、そういう人が多い印象です。 あなたの場合は、「エラーメッセージをちゃんと読もうよ」というふうに感じます。 > Laravelのドキュメントがあまり理解できないというのは技術的な問題なのでしょうか? Laravel に手を出す前に、オブジェクト指向の考え方が身についていない印象です。
phper.k

2020/09/19 12:14

自分の場合は、ドキュメントがわかりにくいと感じた時は、コア部分であってもソースを読んで理解しようとしています。
退会済みユーザー

退会済みユーザー

2020/09/19 12:18

ありがとうございます。ドキュメントでわからない部分があったらソースであったりもっと詳しい記事も今の時代ではあるかと思うので放置せずに自身でより深く掘り下げてみようと思います!
phper.k

2020/09/19 12:43

> もっと詳しい記事も今の時代ではあるかと思う Laravelに関しては皆無です。 Qiitaとかの記事はとても質が低いので、基本的に自分は ドキュメント > ソースコード > Qiita です
退会済みユーザー

退会済みユーザー

2020/09/19 12:49

リレーションの部分やModelの部分についていくつか調べてみたのですがQiitaも含めあまり参考になる記事等がとても少ない印象でした。
退会済みユーザー

退会済みユーザー

2020/09/19 12:58

本件ですが、どのファイル等が必要でしょうか?
phper.k

2020/09/19 13:06 編集

リレーションを定義するときに見るべき情報があるファイルです。 回答者がコピペであなたの手元の状態と同じ状態を再現するために必要なファイルとデータ。 それがない状態だと、再現しようがないので、回答者は脳内実行で回答せざるを得ない。
退会済みユーザー

退会済みユーザー

2020/09/19 14:02

質問本文に追記しました。
phper.k

2020/09/19 14:05 編集

とりあえず、話が通じていない様なので、、、 貸し出し履歴、複数回あるときに正しい貸し出し日時を取得できるかどうか確認してみてください。 質問は既に解決済みにされている様ですし、この件に関しては終了させてください。
退会済みユーザー

退会済みユーザー

2020/09/19 14:27

わかりました。 投稿しましたらこちらにコメントし、ご報告させていただいています。
退会済みユーザー

退会済みユーザー

2020/09/19 15:23

貸し出し履歴が複数回あるときに正しい貸し出し日時を取得できたので本題とは変わってしまっているのですが、当日分のデータに該当するという既存の部分が動作しなくなってしまいました。 ご確認していただけると幸いです。 https://teratail.com/questions/292932
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問