- 投稿日:2021-12-30T21:44:30+09:00
Laravel5.8 をherokuにデプロイして、Group byしたらMySqlから「isn't in GROUP BY」って怒られた話
事象 apiのクエリ実行で以下のエラーが発生した。 message: "SQLSTATE[42000]: Syntax error or access violation: 1055 '<database name>' isn't in GROUP BY 原因 config/database.phpで設定されている、「strict = true」。 解決内容 config/database.phpの'mysql' 内にある、'strict' => true, を 'strict' => false, に変更でMysqlに怒られなくなった。 参考URL Laravelでgroup byしたら、"~ isn't in GROUP BY (~)"って怒られました Laravel's groupBy() not working
- 投稿日:2021-12-30T21:44:30+09:00
Laravel をherokuにデプロイして、Group byしたらMySqlから「isn't in GROUP BY」って怒られた話
事象 apiのクエリ実行で以下のエラーが発生した。 message: "SQLSTATE[42000]: Syntax error or access violation: 1055 '<database name>' isn't in GROUP BY 原因 config/database.phpで設定されている、「strict = true」。 解決内容 config/database.phpの'mysql' 内にある、'strict' => true, を 'strict' => false, に変更でMysqlに怒られなくなった。 参考URL Laravelでgroup byしたら、"~ isn't in GROUP BY (~)"って怒られました Laravel's groupBy() not working
- 投稿日:2021-12-30T19:24:54+09:00
Laravel ってなに?
勉強前イメージ 聞いたことはある プログラム的なやつ? 調査 Laravel とは? ララベル と読み、PHPのフレームワークになります。 フレームワークというのは、 システム開発をする際に必要となる機能などがまとまったものになります。 PHPのフレームワークは他にもCakePHP等があります。 Larabel の特徴 MVCモデルの採用 model,view,controllerに分けられて、 それに伴い開発を進めます。 MVCモデルの使用で、どこに何を書くかが明確になり開発が進めやすくなります。 Composerでパッケージ管理 Composerというパッケージやライブラリを管理するツールで LaravelはComposerで管理されます。 Composerを使うことで依存性の解決や必要なライブラリがあればインストールされます。 データベースの操作が安易 Eloquent ORMとMifrationというのが備わっているので データの扱いを柔軟にし、データベースの管理を安易になっています。 機能やプラグインの開発が盛ん 比較的新しく人気があるため、 新機能のバージョンアップやプラグインの開発も盛んです。 処理速度は速くない 多機能が故に処理速度が比較的ゆっくりな傾向があります。 コードが複雑化しやすい 自由度の高さはありますが、自由が故にコードが複雑化しやすいデメリットがあります。 最初の設計に注意する必要があります。 勉強後イメージ 聞いたことあったけど、PHPのライブラリなんだ・・・ CakePHPの横並びのようなやつ。 参考 Laravelとは何?Laravelの11個の特徴と使う際の注意点を紹介 PHPフレームワーク11選紹介!使用するメリットデメリットなど多数解説
- 投稿日:2021-12-30T17:41:41+09:00
ルーティングについて
ルーティングとは あるアドレスにアクセスをした際、どの処理を行うのかを管理しているのがルーティングです。 laravelのroutesのweb.phpにこのルーティングのコードを記載していきます。 web.php Route::get('/new', 'BookController@new') 例えば、このようなルーティングがあったとします。 https://~newというアドレスにアクセスをした場合、BookController内で定義されているnew(@以降の記述)というメソッドの処理が行われます。 つまり『〇〇のアドレスにアクセスをしたらば□□という処理が行われる』という事です。 書き方 route::get(アドレス名、コントローラー名@メソッド名) Web上で展開されているページはすべてこのweb.phpでルートが記載されております。
- 投稿日:2021-12-30T13:27:10+09:00
LaravelのcommandでUser以外のDBデータをEloquentで取り出せない件
TL;DR Laravelは便利なもので、php artisan hogehoge ってコマンドを簡単に作れます。 これを利用して定期実行させたりもできて使っているのですが、、 User以外のmodel呼び出しでeloqunet使えない!!! 結局、インジェクションのリスクが少ない箇所だったので、直接SQL叩いて解決しました。DB::select(DB::raw()) 症例 例えば app/Console/Commands/HogeCommand.php public function handle() { $users=User::get(); //色々な処理 return Command::SUCCESS; } これは出来るわけです。 でも、このユーザーに紐付いた日記テーブル(diaries)から値を取ろうとすると public function handle() { $users=User::get(); $diaries=Diary::get(); //色々な処理 return Command::SUCCESS; } ここでの$diariesは空のオブジェクトになります。 もちろんデータは入っていまして、Controllerとかで呼び出す分には正しく動きます。 public function handle() { $users=User::with('diaries')->get(); //色々な処理 return Command::SUCCESS; } withを使って呼び出してもdiariesの情報は手に入りません……空になります。 エラーも出ていないのが厄介なところです。 考察 Laravel素人なので詳しいことは分かりませんが。WordPressのテーマ制作に似たような症例があります。 functions.phpにおいて記事の情報(タイトルやACFのget_fieldなど)は引っ張ってこれるがカテゴリなどのタクソノミーの情報(get_termsなど)は引っ張ってこれない。 これと同じく、command実行時点ではuser以外のmodel情報はまだ読み込まれていないのかもしれません。 一時的な解決策 SQLの直打ち SQLインジェクションの危険があるため、お気をつけてください。 commandでの利用だとそこまで危険性がないので、私はこの方法を取りました。 例 $counter=DB::select(DB::raw("select count(*) as counter from ".$table." where user_id=".$user_id)); 原点回帰という訳です。
- 投稿日:2021-12-30T12:27:05+09:00
laravel8 ルーティングファイルを分ける
概要 laravelのルーティングファイルweb.phpに記載されている内容を新しく作成したルーティングファイルに記載する方法をまとめる 情報 ルーティングファイルを分割したコードを下記のリポジトリにアップしておく。 https://github.com/miriwo0104/laravel8_easy_crud/tree/route_file_branche 方法 アプリ名ディレクトリ/routes/直下に新規のルーティングファイル「test.php」を作成して下記の様に記載する。 アプリ名ディレクトリ/routes/test.php <?php use Illuminate\Support\Facades\Route; Route::get('/test', function() { return 'test'; }); アプリ名ディレクトリ/app/Providers/RouteServiceProvider.phpのboot()内部を下記の様に修正する。 アプリ名ディレクトリ/app/Providers/RouteServiceProvider.php /** * Define your route model bindings, pattern filters, etc. * * @return void */ public function boot() { $this->configureRateLimiting(); $this->routes(function () { Route::prefix('api') ->middleware('api') ->namespace($this->namespace) ->group(base_path('routes/api.php')); Route::middleware('web') ->namespace($this->namespace) ->group(base_path('routes/web.php')); // 下記を追記 Route::middleware('web') ->namespace($this->namespace) ->group(base_path('routes/test.php')); }); } ローカルサーバーを起動してhttp://127.0.0.1:8000/testにアクセスしたところ「test」の文字列が表示されたのでルーティングは問題なく動作している。
- 投稿日:2021-12-30T07:22:22+09:00
Eloquant updateを利用してカラム情報を更新する
概要 Eloquantのupdateを用いてカラム情報を更新する方法をメモ的にまとめる 謝辞 こちらの知見は一緒にプロジェクトに参画してくださっているエンジニアさんから教えていただいた内容です。 改めてこの場を借りてお礼申し上げます!教えていただきありがとうございます! 情報 今回のコードは下記のリポジトリにアップしている。 https://github.com/miriwo0104/laravel8_easy_crud/tree/update 方法 当該のモデルクラスで$fillableを登録する。(updateで編集可能なカラム名を$fillableに記載して登録する。) app/Models/Content.php /** * 複数代入可能な属性 * * @var array */ protected $fillable = [ 'カラム名', ]; 当該のモデルクラスを用いてDBを更新する処理が記載されている箇所に下記のような記載を行う。(筆者の場合リポジトリクラスにDBアクセス処理が記載されている。) app/Repositories/ContentRepository.php <?php namespace App\Repositories; use App\Models\Content; use Illuminate\Database\Eloquent\Model; class ContentRepository implements ContentRepositoryInterface { public function __construct(Content $content) { $this->content = $content; } /** * idを用いて情報を取得 * * @param integer $id * @return Content */ public function getById(int $id) { return $this->content->find($id); } /** * 投稿内容の保存 * * @param array $requestBody * @return Model */ public function update($requestBody) { $content = $this->getById($requestBody['id']); return $content->update($requestBody); } ちなみに上記のupdate()に渡される$requestBodyには下記のような値が格納されている。 array:2 [▼ "id" => "12" "content" => "投稿編集内容" ] 参考文献 https://readouble.com/laravel/8.x/ja/eloquent.html#mass-assignment
- 投稿日:2021-12-30T06:34:25+09:00
Laravelで直接SQL文を実行する
Laravelで直接SQLを実行するにはその種類によってメソッドが変わります。参照系の場合には DB::select() を利用します。 $sql = "select i.* from input_tmps i where i.id is not null;"; $rows = DB::select($sql); $retArray = []; /** 結果取得 **/ foreach($rows as $row) { $retArray[$row->id][] = $row->value; } LOCK文等の場合には DB::unprepared() を使います。 DB::unprepared( 'LOCK TABLES ' . DB::getTablePrefix() . 'input_tmps1 WRITE,' . DB::getTablePrefix() . 'input_tmps2 WRITE,' . DB::getTablePrefix() . 'input_tmps3 WRITE, ' . DB::getTablePrefix() . 'input_tmps4 WRITE' );