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

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

ただいまの
回答率

89.11%

Laravel 5.7 join query の作成について

解決済

回答 1

投稿

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

KenTse

score 20

前提・実現したいこと

私は以下のリレーションモデルがあります。
BookUser(one) to Book(many).
で、Bookの一覧リストの機能を作りたい時にControllerでqueryを作り空いてるのBookを含めたリスト作って欲しいです、それで、ajaxでorderByなど内容を変えるとか実現したい。

でもいま出てる内容と実際にほしい内容が違います。借りていた本した出ていないのです、

    public function index(BookIndexRequest $request)
    {
        $query = Book::select( 'books.*')
            ->john( 'bookUsers' , 'bookUsers.id' , '=', 'books.borrowing_user_id' );

        if ($request->ajax()) {
            if ( !empty( $request->get('seachText') ) ) {
                $query->where('book.name', 'LIKE', '%'.$request->get('seachText').'%');
            }
            if ( !empty( $request->get('orderBys') ) ) {
                foreach ($request->get('orderBys') as $key => $value) {
                    $query->orderBy($key, $value);
                }
            }
            return \Response::json($query->get() );
        }

        $books = $query->get();
        return view('books.index', compact( 'books'));
    }

    /**
    query 内容
    books.book_name | books.borrowing_user_id | bookUsers.name
    BookA           | 1                       | Tom
    BookC           | 5                       | Peter
    */


実際にほしい内容はこんな感じ

books.book_name | books.borrowing_user_id | bookUsers.name
BookA           | 1                       | Tom
BookB           | Null                    | Null
BookC           | 5                       | Peter
BookD           | Null                    | Null
BookE           | Null                    | Null
BookF           | Null                    | Null
BookG           | 11                      | Ken

ほしい内容のqueryの作り方をご教授お願い致します。 

該当のソースコード

BookUser model

class BookUser extends Model 
{
    use SoftDeletes;

    protected $fillable = [
        'name'
        ,'created_at'
        ,'updated_at'
        ,'deleted_at'
    ];
}

public function books()
{
    return $this->hasMany(Book::class, 'borrowing_user_id', 'id');
}


Book model

class Book extends Model 
{
    use SoftDeletes;

    protected $fillable = [
        'borrowing_user_id'  //nullの時に空いてる
        ,'book_name'
        ,'created_at'
        ,'updated_at'
        ,'deleted_at'
    ];
}

public function borrowing_user()
{
    return $this->belongsTo(User::class, 'borrowing_user_id', 'id');
}

補足情報(FW/ツールのバージョンなど)

Laravel 5.7
PHP 7.2
CentOS 7

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+1

Controller

    public function index(BookIndexRequest $request)
    {
        $books = Book::query()
            ->with(['borrowing_user'])
            ->when($request->get('seachText'), function ($query) use ($request) {
                $query->where('name', 'LIKE', '%' . $request->get('seachText') . '%');
            })
            ->when($request->get('orderBys', function ($query) use ($request) {
                foreach ($request->get('orderBys') as $key => $value) {
                    $query->orderBy($key, $value);
                }
            }))
            ->get();

        if ($request->ajax()) {
            return \Response::json($books);
        }
        return view('books.index', compact('books'));
    }

Model

class Book extends Model
{
    use SoftDeletes;

    protected $fillable = [
        'borrowing_user_id',
        'book_name',
        'created_at',
        'updated_at',
        'deleted_at'
    ];

    public function borrowing_user()
    {
        return $this->belongsTo(User::class, 'borrowing_user_id', 'id')
            ->withDefault();
    }
}

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/12/05 16:20

    ご回答ありがとうございます。
    コードがうまく動くですけど、
    Controllerの
    ->when($request->get('seachText'),
    はつまりseachText空しゃあない時にはいる感じ?
    Modelの 
    ->withDefault();
    は何をやっているのかよく分からない説明お願いしてもよろしいでしょうか。

    キャンセル

  • 2019/12/05 16:43

    その前にリファレンスを読んだ上で、わからない部分を聞いてくださいませんか?

    キャンセル

  • キャンセル

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

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