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

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

ただいまの
回答率

89.06%

[Laravel]指定したidの内容を複数モデルから呼び出したい。

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 390

noricoonco

score 15

選択したidのページにてid個別の情報を出そうと思っています。
ふたつのモデルにはいっているデータを呼び出したいのですがうまくできません。。
hasMany/belongsToでモデルにて結合しています。

Route::get('book/select/{id}', 'BookController@select');
<?php

namespace App\Http\Controllers;

use App\Book;
use App\Author;
use Illuminate\Http\Request;

class BookController extends Controller {

{省略}

    public function select(Request $request, $id) {

        $author = \App\Author::find($id);
        $name = $author->name;
        $books = $author->books()->orderBy('created_at', 'DESC');

        return view('book.select')->with(array('author' => $author, 'name' => $name, 'books' => $books));
    }

}
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Author extends Model {

    public $timestamps = false;
    protected $fillable = [
        'name'
    ];

    public function books() {
        return $this->hasMany('App\Book');
    }

}
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Book extends Model {

    protected $fillable = [
        'title',
        'author_name',
        'company'
    ];

    public function author() {
        return $this->belongsTo('App\Author');
    }

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • m.ts10806

    2019/07/01 22:06

    >うまくできません。。
    それなりのコードは組まれているようですが「何が」「どう」うまくいかないのでしょうか?
    想定する動作と現在のコードにおける問題を具体的に記載してください。
    https://teratail.com/help/question-tips#questionTips3-4
    提示内容だけでは他者がコピペですぐ再現できるわけではないので、その内容が回答のヒントとなります。

    キャンセル

  • noricoonco

    2019/07/01 22:21

    ご指摘ありがとうございます。
    モデルのAuthorとBookをhasMany/belongsToで結合しているので、
    $author = \App\Author::find($id);
    $books = $author->books()->orderBy('created_at', 'DESC');
    これでBookのデータが呼び出せると思ったのですが、画面には表示されませんでした。エラーも出ずに表示されない現象が起きたので、データ処理で正しいものを呼び出せていないものと思われます。
    しかしエラーがでないということはどういうことなのか・・・と自分で解決できず質問させていただきました。

    キャンセル

回答 3

checkベストアンサー

+1

get() が抜けているため、Collectionではなくクエリビルダのオブジェクトがセットされてしまっているのではないでしょうか?

$books = $author->books()->orderBy('created_at', 'DESC');


$books = $author->books()->orderBy('created_at', 'DESC')->get();


と修正してみてください。

7/3追記

コメントに書いていただいたmigrationファイルの内容を見ました。
テーブル同士の参照関係を作るため、下記を追加してください。

$table->foreign('author_id')->references('id')->on('authors');


下記ドキュメントの[外部キー制約]項をご参考ください。
https://readouble.com/laravel/5.8/ja/migrations.html

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/07/03 10:40

    ありがとうございます!
    hasManyの知識が浅かったですね。。

    class CreateBooksTable extends Migration
    {
    /**
    * Run the migrations.
    *
    * @return void
    */
    public function up()
    {
    Schema::create('books', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->string('title');
    $table->string('author_name');
    $table->string('company');
    $table->date('date');
    $table->timestamps();
    });
    }
    上記に、
    $table = bigIncrement('author_id')を追加するということでしょうか?

    キャンセル

  • 2019/07/03 11:02

    migrationファイルありがとうございます!
    回答に追記しましたのでご確認ください。

    質問とは直接関係ないのですが、 `author_name` は 本来authorsテーブルにあると思われるので、booksテーブルには不要ではないでしょうか?

    キャンセル

  • 2019/07/03 11:04

    ご指摘、参考サイト諸々ご丁寧にありがとうございます!

    >>`author_name` は 本来authorsテーブルにあると思われるので、booksテーブルには不要ではないでしょうか?
    まさにそうでした。
    外部キーの制約とあわせてmigrationを今一度学習します。
    長々ありがとうございました!

    キャンセル

0

とりあえずこ以下でデータは呼び出せるので一旦解決とします。
DBやEroquentについては勉強不足なのでやり直そうと思います。
回答いただきありがとうございました。

public function select(Request $request, $id) {

$author = \App\Author::find($id);
$books = \App\Book::find($id);
$name = $author->name;
$title = $books->title;

return view('book.select')->with(compact('name', 'title'));

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

-1

とりあえずこ以下でデータは呼び出せるので一旦解決とします。
DBやEroquentについては勉強不足なのでやり直そうと思います。
回答いただきありがとうございました。

public function select(Request $request, $id) {

$author = \App\Author::find($id);
$books = \App\Book::find($id);
$name = $author->name;
$title = $books->title;

return view('book.select')->with(compact('name', 'title'));

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 89.06%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る