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

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

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

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

1回答

5612閲覧

LaravelでCollectionクラスからBuilderクラスに変換する方法

hattin

総合スコア18

Laravel

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

1クリップ

投稿2020/08/29 02:45

編集2020/08/30 08:40

環境

windows10home
php ver7.4.2
composer ver1.9.2
laravel ver6.18.14

実現したいこと

laravelで配列になってしまっているものをbuilderクラスに変換したいです。
理由としては、その後withやwhereやpaginationメソッドを使うためです。

現状

現状としては、DB::select()で配列としてデータを受け取り、その後Builderクラスに変換し、様々なメソッドを使用しようとしていますが、Builderクラスができないのでそれが実行できていない状況です。DB::select()内は複雑な内容となっており、Eloquentでの記述は考えない状況です。

php

1$keyword = request->input('keyword') 2$filterUsers = DB::select(諸事情により伏せさせていただきます); 3 4//buildメソッドは仮で、ここでBuilderクラスにしたいです。 5$builder = build($filterUsers) 6 7$resultUsers = $builder->with(['profile', 'followers']) 8 ->where('name', 'like', $keyword) 9 ->paginate(10);

上記のコードでArray→Collectionクラスに変換する方法があるのに対し、Collection→Builderクラスに変換する方法は存在しないのでしょうか?自分の検索力がないのか、一向に解決できる方法が見つからないのであるのであれば教えていただきたいです。または、そのようなことは出来ないということであればそちらも教えていただきたいです。
よろしくお願いいたします。

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

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

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

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

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

Suumon

2020/08/30 03:51

可能であれば、Collection→Builderクラスに変換したいと思っている箇所のコードを記載いただけないでしょうか?
hattin

2020/08/30 05:01

Suumon様ご指摘ありがとうございます。 公開できない箇所もあり申し訳ないですが、該当箇所のコードを編集しておきましたのでよろしくお願い致します。
guest

回答1

0

ベストアンサー

とりあえず、元のコードが以下のようになっているという前提で話をします。

php

1$keyword = request->input('keyword') 2$filterUsers = DB::select('select * from users'); 3$collection = collect($filterUsers); 4 5$resultUsers = $builder->with(['profile', 'followers']) 6 ->where('name', 'like', $keyword) 7 ->paginate(10);

クエリビルダを使っていることが全ての元凶。

php

1$filterUsers = User::query()->get();

のように、Eloquent を使うべき。しかも、使いもしないのに、collect($filterUsers) でコレクションをわざわざ作っているのも意味不明すぎる。
仮に limit 使っていないときのレコード総数でデータを使いたいのだとしても、

php

1$keyword = request->input('keyword') 2$builder = User::query()->where('name', 'like', $keyword); 3 4$collection = $builder->get(); 5 6$resultUsers = $builder->with(['profile', 'followers']) 7 ->paginate(10);

とすればいいし、そもそも総数が知りたい理由だけであれば、paginate クラスにその値は持っているのでその必要はない。

php

1$keyword = request->input('keyword') 2$resultUsers = User::query()->where('name', 'like', $keyword) 3 ->with(['profile', 'followers']) 4 ->paginate(10);

投稿2020/08/30 08:04

phper.k

総合スコア3923

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

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

hattin

2020/08/30 08:37

phper.k様回答および指摘ありがとうございます! おっしゃる通りEloquentで処理できるものは処理すべきということは理解しております。 私もEloquentで処理できればしたいところなのですが、DB::select()内が複雑なコードとなっておりまして使わざるを得ない場合ということで質問させていただいております。 なので、DB::select()で配列でデータが返ってきている場合、Eloquent/Builderに変換する方法について質問させていただいております。
phper.k

2020/08/30 09:01

> DB::select()内が複雑なコードとなっておりまして使わざるを得ない場合ということで質問させていただいております。 全てEloquent で書き換え可能です
phper.k

2020/08/30 09:30 編集

> Eloquent/Builderに変換する方法について質問させていただいております。 必要なプロパティが存在していないので、不可能です。 paginate() が使いたいだけで、builderにしたいという要件なら、Collectionクラスの chunk() でも代用できる
hattin

2020/08/30 15:13

なるほど。。。 必要なプロパティが存在しないので不可能なんですね。 教えていただきありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問