20210514のPHPに関する記事は13件です。

Laravel6.x 画像をリサイズしてアップロードする方法

Authの認証機能で作成された新ユーザー登録に画像のアップロード機能を追加していきます。画像アップロード処理はIntervention Imageライブラリを使用して画像をリサイズして保存する方法をやっていきます。 画像保存するにあたってusersテーブルにimg_nameカラムを追加する Intervention Imageについて 実装環境 PHP 7.3 Laravel 6.20.26 1.Intervention Imageをインストール まずはライブラリをcomposerを使用してインストール $ composer require intervention/image 次に config/app.php でプロバイダーとエイリアスに追加する。 config/app.php 'providers' => [ Intervention\Image\ImageServiceProvider::class, ], 'aliases' => [ 'Image' => Intervention\Image\Facades\Image::class, ], 2.画像アップロード処理 img_nameカラムを追加したのでApp\User.phpで追加したカラムも保存できるよいうに$fillableにカラム名を追記する。 app/User.php protected $fillable = [ 'name', 'email', 'password', 'img_name', //img_name追加 ]; 新規登録の処理が書いてあるapp/Http/Controllers/Auth/RegisterController.phpにアップロード処理を追記する。 app/Http/Controllers/Auth/RegisterController.php namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; use App\Providers\RouteServiceProvider; use App\User; use Illuminate\Foundation\Auth\RegistersUsers; use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Validator; use Intervention\Image\Facades\Image; //Intervention Imageライブラリ:追記 class RegisterController extends Controller { use RegistersUsers; protected $redirectTo = RouteServiceProvider::HOME; public function __construct() { $this->middleware('guest'); } protected function validator(array $data) { return Validator::make($data, [ 'name' => ['required', 'string', 'max:255'], 'email' => ['required', 'string', 'email', 'max:255', 'unique:users'], 'password' => ['required', 'string', 'min:8', 'confirmed'], 'img_name' => ['file', 'image', 'mimes:jpeg,png,jpg,gif', 'max:2000'], ]); } protected function create(array $data) { if (isset($data['img_name'])) { $img_file = $data['img_name']; //画像がアップロードされたのか確認 if ($img_file->isValid()) { //画像の拡張子取得 $extension = $img_file->extension(); //ファイル名作成 $img_name = uniqid(mt_rand()) . '.' . $extension; //画像を編集して、保存 $img = Image::make($img_file->getRealPath()); $img->resize(400,400)->save(storage_path() . '/app/public/images/' . $img_name); } else { $img_name = ''; } } else { $img_name = ''; } return User::create([ 'name' => $data['name'], 'email' => $data['email'], 'password' => Hash::make($data['password']), 'img_name' => $img_name, ]); } } 解説 validatorメソッドに画像のバリデーション追記。 protected function validator(array $data) { return Validator::make($data, [ 'name' => ['required', 'string', 'max:255'], 'email' => ['required', 'string', 'email', 'max:255', 'unique:users'], 'password' => ['required', 'string', 'min:8', 'confirmed'], 'img_name' => ['file', 'image', 'mimes:jpeg,png,jpg,gif', 'max:2000'], ]); } createメソッドに画像をリサイズして保存する処理を追記。 Laravelは画像のアップロードした際/storage/app/public配下にファイルが保存されるようになっているので、/storage/app/public配下にimagesディレクトリを作成してそこに保存するよいうにする。 また、サイトのページに公開する際はpublicフォルダが読み込まれるのでpublicフォルダ内に画像ファイルがなくてはいけない。 /storage/app/publicからpublicにシンボリックリンクを作成することで画像表示できるよいうになる。 php artisan storage:linkをコマンドプロンプトで実行する。 protected function create(array $data) { if (isset($data['img_name'])) { $img_file = $data['img_name']; //画像がアップロードされたのか確認 if ($img_file->isValid()) { //画像の拡張子取得 $extension = $img_file->extension(); //ファイル名作成 $img_name = uniqid(mt_rand()) . '.' . $extension; //画像を編集して、保存 $img = Image::make($img_file->getRealPath()); $img->resize(400,400)->save(storage_path() . '/app/public/images/' . $img_name); } else { $img_name = ''; } } else { $img_name = ''; } return User::create([ 'name' => $data['name'], 'email' => $data['email'], 'password' => Hash::make($data['password']), 'img_name' => $img_name, ]); } }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravelで <textarea>の先頭にスペースが出てくる

ローカルで開発中地味に改善するのに困ったのでメモ 実装したいもの ・自己紹介に入力した内容を修正したい このように書いていました。 edit.blade.php <textarea> {{ old($profile) ?? $profile->text }} </textarea> このように先頭に変なスペースが出てきます。 改善方法 ・一行で書く。 たったこれだけでした。 edit.blade.php <textarea>{{ old($profile) ?? $profile->text }}</textarea> フロントをまだ使いこなせていないのでメモしていきます。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【環境構築】Docker×Laravel×MySql

docker×laravel×mysqlを使った環境構築を行ったのでその手順をご紹介します。 初めてdockerで環境構築を行ったので、少しでも参考になればと思います。 環境 環境     バージョン PHP 7.0.27 FW CakePHP3.2.13 Apache 2.2.15 OS CentOS6.9 DB MySQL5.6.39 手順 DockerフォルダDL Git Clone Docker コンテナに入る Apache起動 ドキュメントルート設定 Composer install mysql起動 データベース作製 app.phpの設定 データベース接続 環境構築してみよう DockerフォルダDL 今回は元々用意していたDockerFile,ymlファイルなどをまとめてダウンロードしてます。 下記、フォルダ構造になります。 -/ |- docker-compose.yml |- docker |- db | |- Dockerfile | |- files | |- entry.sh | |- my.cnf | | |- web |- Dockerfile |- files |- composer.phar |- dev.conf |- php.ini |- ssl.conf Git Clone githubにてプロジェクトの取得。 フォルダ構造は下記のようになりました。 -/ |- project |- docker-compose.yml |- docker Dockerコンテナに入る コンテナに入る前にイメージの作製、コンテナを起動します。 コマンドラインで下記を実行する。 ビルド docker build // ビルドすることでdocker fileからイメージが得られます。 コンテナの起動 $ docker-compose up -d // コンテナを起動します。  下記のコマンドで、ビルドとコンテナの起動を一度に行えます。 ビルドとコンテナの起動 $ docker-compose up -d --build // イメージのビルドから始めてコンテナを起動します。 $ docker ps //起動中のコンテナの確認  オプション-dについて $ docker-compose up // ターミナルでコンテナを起動しているため、同じターミナルでは作業できない。 $ docker-compose up -d // コンテナをバックグラウンドで起動するため、同じターミナルで作業ができる。 下記のコマンドでコンテナに入ります。 $ docker exec -it CONTAINER ID /bin/bash //CONTAINER IDは docker psをした際に確認できます。 Apache起動 webコンテナ内で、下記コマンドでApache起動する。 service httpd start Apache起動 service httpd stop Apache停止 service httpd restart Apache再起動 /etc/init.d/httpd status Apache状態確認 ドキュメントルート設定 web内のhttpd.confのドキュメントルートの設定を確認します。 今回のディレクトリ構造だとvar/www/htmlで問題なさそうです。 composer install composer installができませんでした。 アクセス権限の問題だと思い、アクセス権限777に変更しました。 アクセス権限に関しては下記の記事を参考にしました。 https://qiita.com/t-a-run/items/239ed690ece7a011804a 下記、実行できました。 因みに、composer installはprojectフォルダで行いました。 compser install この状態でアクセスするとデータベースエラーとブラウザに表示されます。 エラーの内容は、そのような(接続した)ファイルは見つからない。 database error(SQLSTATE[HY000] [2002] No such file or directory mysql起動 mysqlを動作させます。 webコンテナに入った時、同様にdbコンテナに入ります。 service mysqld status //mysqlの起動状態の確認 service mysqld start //mysqlの起動 ログイン前に初期のユーザー名とパスワードを確認します。 DBコンテナ内でmysqld.logを確認します。 cat mysqld.log A temporary password is〜に書いてあるユーザー名パスワードを取得。 ユーザー名:root データベースにログインします。 docker exec -it コンテナID mysql -u root -p パスワード再設定->データベース作製->テーブル作成をおこないます。 app.phpの設定 git clone時には、app.phpは含まれていません。作成しましょう。 -/ |- project |- config |-app.php app.phpの書き方はネットで検索すると出てきます。今回は他で使っていたファイルをそのままコピーして中身を編集しました。主にデータベースのしか触っていないです。 'Datasources' => [ 'default' => [ 'className' => 'Cake\Database\Connection', 'driver' => 'Cake\Database\Driver\Mysql', 'persistent' => false, 'host' => 'localhost', /** * CakePHP will use the default DB port based on the driver selected * MySQL on MAMP uses port 8889, MAMP users will want to uncomment * the following line and set the port accordingly */ //'port' => 'non_standard_port_number', 'username' => 'root', 'password' => 'データベース作成時に設定したパスワード', 'database' => 'データベース作成時に設定したパスワード', 'port' => ポート番号, 'encoding' => 'utf8', 'timezone' => 'UTC', 'flags' => [], 'cacheMetadata' => true, 'log' => false, cat mysqld.log A temporary password isに書いてあるパスワードを取得 ->dbコンテナでmysqlをrestartし、ログイン->パスワード再設定->データベース作製->テーブル作成-> データベース接続 sequel proを使い、クイック接続にて接続テストを実行しました。 無事に接続完了しました。 ブラウザでlocalhostと検索すると無事開けました。 参考資料 docker-compose.yml の内容を理解しよう https://futureys.tokyo/lets-understand-contents-of-docker-compose-yml/ Docker compose ことはじめハンズオン https://qiita.com/TsutomuNakamura/items/7e90e5efb36601c5bc8a Dockerfileの書き方と使い方 https://blog.codecamp.jp/docker-file-how-to 起動中の docker コンテナのシェルに入る https://qiita.com/sekizo/items/27cc9b406332afc674f6 データベース作製 https://noumenon-th.net/programming/2019/04/01/docker-entrypoint-initdb01/ chmodで設定する権限の書き方 https://qiita.com/irasally/items/6ebc3c68e22905fb7330
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PDO

PDO(PHP Data Object) データベースにアクセスするためのインターフェイス 接続するデータベースが変更されても同じ関数を使用してクエリ(データベースへの問い合わせ)の発行やデータの取得が行えます。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHPオリジナル問題作成2

続き オブジェクト指向、インスタンスとクラス ■問題1 other/Hero.php/Heroクラスを作成。name(String型),hp(int型)のフィールドを準備し、以下のメソッド作成。 メソッド名:sit 戻り値:なし 引数リスト:int sec 処理内容: ・自分自身のhpフィールドに引数(sec)をたす。 ・自分自身のnameフィールドを表示。(表示形式:nameフィールド+は+引数(sec)+秒座った。) ・引数(sec)を表示。(表示形式:HPが+引数(sec)+ポイント回復した。) main8.phpでHeroインスタンスを生成。 nameフィールド:カズヤ(自身の名前) hpフィールド:100 表示内容: ・sitメソッドを呼び出してください。(引数は5) ・hpフィールドを表示してください。 解答 mai8.php //問題1 <?php namespace mondai\main; use mondai\other\hero\Hero; require 'other/Hero.php'; $hero = new Hero; $hero->name = "カズヤ"; $hero->hp = 100; $hero->sit(5); echo $hero->hp; //実行結果 カズヤは5秒座った HPが5ポイント回復した 105 Hero.php <?php namespace mondai\other\hero; class Hero { public String $name; public int $hp; public function sit (int $sec) { $this->hp +=$sec; echo $this->name."は".$sec."秒座った"."<br>"; echo "HPが".$sec."ポイント回復した"."<br>"; } } さまざまなクラス機構、カプセル化 ■問題1 other/Test2.php/Test2クラスを作成し、name(String型)、age(int型)フィールドを作成してください。(アクセス修飾子 private) name,ageフィールドのgetter,setterを作成してください。 main9.phpでTest2インスタンスを生成。 Test2クラスのname、ageフィールドに値をセットしてください。(値はname(自分の名前),age(自分の年齢)) name、ageフィールドにセットした値を表示させてください。 (表示形式:年齢は+name(自分の名前)+歳です) (表示形式:名前は+age(自分の年齢)+です) ■問題2 other/Hero1.php/Hero1クラス作成し、hp(int型)のフィールド,Hero(コンストラクタ)を作成してください。※コンストラクタ(中身:this.hp=100;) main9.phpでTest2インスタンスを2つ生成し表示させてください。(今回は100が2つ表示されているとOKです。) 解答 main9.php //問題1 <?php namespace mondai\main; use mondai\other\test\Test2; require 'other/Test2.php'; $t = new Test2; $t->setAge(26); $t->setName("カズヤ"); echo "年齢は".$t->getAge()."歳です"; echo "<br>"; echo "名前は".$t->getName()."です"; //実行結果 年齢は26歳です 名前はカズヤです Test2.php <?php namespace mondai\other\test; class Test2{ private String $name; private int $age; public function getName(){ return $this->name; } public function setName(String $name){ $this->name=$name; } public function getAge(){ return $this->age; } public function setAge(int $age){ $this->age=$age; } } main10.php //問題2 <?php namespace mondai\main; use mondai\other\hero\Hero1; require 'other/Hero1.php'; $t = new Hero1; $t1 = new Hero1; echo $t->hp; echo "<br>"; echo $t1->hp; //実行結果 100 100 Hero1.php <?php namespace mondai\other\hero; class Hero1 { public int $hp; function __construct() { $this->hp = 100; } } 11継承 ■問題1 other/Hero2.php/Hero2クラスを作成し、attackメソッド(内容:攻撃)、runメソッド(内容:逃げる)を追加してください。 other/SuperHero.php/SuperHeroクラス作成(Hero2クラスを継承)を作成し、 flyメソッド(内容:飛ぶ)、landメソッド(内容:着地)、runメソッド(内容:スーパーヒーローが逃げた)を追加してください。 main11.phpでSuperHeroインスタンス作成してください。 SuperHeroクラスのrunメソッド(内容:スーパーヒーローが逃げた)とHeroクラスのrunメソッド(内容:逃げる)を呼び出してください。 解答 main11.php //問題1 <?php namespace mondai\main; use mondai\other\hero\SuperHero; require 'other/Hero2.php'; require 'other/SuperHero.php'; $s=new SuperHero; $s->run(); echo "<br>"; $s->go(); //実行結果 スーパーヒーローが逃げた 逃げる Hero2.php <?php namespace mondai\other\hero; class Hero2 { function attack() { echo "攻撃"; } function run() { echo "逃げる"; } } SuperHero.php <?php namespace mondai\other\hero; class SuperHero extends Hero2 { function fly(){ echo "飛ぶ"; } function land(){ echo "着地"; } function run() { echo "スーパーヒーローが逃げた"; } function go(){ parent::run(); } } 続く
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHPのdate関数、timestampを使って2021/01/01から12/31までのカレンダーを作ってみる。

date関数 日付とか時刻を返してくれる関数です。試しに色々と書いてみます。 print(date('G時i分s秒')."\n"); ->4時47分57秒 print(date('Y/n/j')."\n"); ->2021/5/14 print(date('Y F,j')."\n"); ->2021 May,14 print(date('n/j(D)')."\n"); ->5/14(Fri) こんな感じになります。 date関数のパラメータ(GとかY,n,jなどは下記のqiitaなどを参照してください。 https://qiita.com/shuntaro_tamura/items/b7908e6db527e1543837 date関数の引数 date関数のリファレンスでdate関数の書式を確認してみます。 date ( string $format , int|null $timestamp = null ) : string これはdate関数が日時をどう表すのかのフォーマットです。 第二引数にタイムスタンプなるものが指定されています。 ではこのタイムスタンプとは何か。 タイムスタンプ タイムスタンプとは1970年01月01日から数えられている秒数を表しています。 今日現在のタイムスタンプは1620950400で1970年01月01日から1620950400経ったことを意味してます。 strtotime関数 文字列をタイムスタンプに変換してくれる関数です。 (文字列) (を) (タイムスタンプ) string to timestamp = str to time = srttotime //今日のタイムスタンプ print(strtotime(today)); -> 1620950400 //2日後のタイムスタンプ print(strtotime('+2day'); //信長が光秀に殺された日 print(strtotime('1582-6-21')); -> -12229315200 こんな感じです。 date関数の引数にタイムスタンプを渡してみる。 date関数の引数にタイムスタンプを渡してみるとどうなるか実際に確認してみます。 print(date('Y/n/j', 86400)); ->1970/1/2 print(date('Y/n/j', 72800)); ->1970/1/3 これはタイムスタンプに86400秒を指定しています。これはつまり24時間後なので、タイムスタンプを数え始めた1970年1月1日の24時間後の日付を出力しています。2番目のprintは72時間後の1月3日です。 ではこれを元に2021/01/01のタイムスタンプと12/31のタイムスタンプを取得して、後はループで86400秒、つまり1日置きにループしたいと思います。 //2021年1月1日のタイムスタンプを取得 $first_date = strtotime('2021-01-01'); //2021年12月31日のタイムスタンプを取得 $end_date = strtotime('2021-12-31'); //$first_dateが$end_dateより大きくなるまで86400秒を足して1日後を表示する for($i=$first_date; $i<=$end_date;$i = $i + 86400){ print(date('Y/n/d(D)'."\n", '+'.$i.'day')); } これで表示結果が 2021/1/01(Fri) 2021/1/02(Sat) 2021/1/03(Sun) 2021/1/04(Mon) 2021/1/05(Tue) 2021/1/06(Wed) 2021/1/07(Thu) 2021/1/08(Fri) 2021/1/09(Sat) . . . 2021/12/30(Thu) 2021/12/31(Fri) と表示されるはずです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【php】文字列を入力し、その文字列を逆順に出力するPGを作成せよ。文字は半角英数字のみで、20 文字以内とします。

入力条件 入力内容が1行に与えられる。 入力内容を逆順にした文字列を1行に出力する 入力データ w32nimda 予想結果 admin23w <?php $str = trim(fgets(STDIN)); $str_length = strlen($str); echo "入力文字数:".$str_length."\n"; echo "入力した値:".$str."\n"; if (preg_match("/^[a-zA-Z0-9]+$/", $str)) { echo "すべて半角英数である"."\n"; if ($str_length <= 20) { // 変数を配列に変換; $arr1 = str_split($str); // echo $arr1[2]."\n"; // 配列を逆さまにする; $arr1 = array_reverse($arr1); foreach ($arr1 as $value) { echo $value; } } else { echo "20文字を超えています。"; } } else { echo "全角文字が含まれています。"."\n"; } ?>
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

日本語をエスケープしないでJSON文字列を作る

概要 JSON形式で保存されているログを画面出力することがあった。 しかし、 json_encode() した文字列のままだと、 日本語部分が文字化けしたように読めない。 そのため、一度デコードして、整形し直してみる。 独自関数を作ってみる... $log=print_r($json, true) でも配列の中身を出力できるが、 bool型のところがfalseの場合空文字になったりとイマイチ見た目が悪かった。 そのため、独自関数を作って対応してみる。 /** * @param string $json * @param bool $is_vector * @return string */ function decodeMbJsonString (string $json, $is_vector = false) { // 一度デコードして、日本語を読めるようにする $data = json_decode($json, true); // JSON形式に再整形する $data = array_map(function ($key, $value) { if (is_null($value)) { // nullの場合、nullという文字列に変換する $value = 'null'; } else if (is_bool($value)) { // bool型の場合、文字列に変換する $value = $value === true ? 'true' : 'false'; } else if (is_array($value)) { // 配列か連想配列か判定して、再帰処理する $is_vector = (array_values($value) === $value); $value = $this->decodeMbJsonString($value, $is_vector); } // キーが整数の場合は、「"」で囲まないようにする $format = (is_int($key)) ? '%s:"%s"' : '"%s":"%s"'; return sprintf($format, $key, $value); }, array_keys($data), array_values($data)); $format = ($is_vector === true) ? '[%s]' : '{%s}'; return sprintf($format, implode(',', $data)); } json_encodeで対応できそう... json_encode()関数のオプションで対応可能なようです。 function decodeMbJsonString (string $json) { $data = json_decode($message, true); return json_encode($data,JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES|JSON_PRETTY_PRINT); } こっちの方が実装が楽ですね。 こんなオプションがあったとは知らなかった... (^^;) 参考サイト JsonデータをPHPで作成した時のエスケープする、エスケープしないの選択処理の話 以上
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【php】ヒット&ブローの問題

ヒットアンドブローというゲームがあります。A さんが異なる4個の数字を思い浮かべ、B さんがその数字を当てます。B さんが選んだ4個の数字に対し、A さんは、 場所が一致している数字の個数(ヒット) 場所は違うが正解の中に含まれる数字の個数(ブロー) を答えます。それを手がかりに、B さんは再び4個の数字を選んで A さんに伝えます。例えば、A さんが 9 1 8 2 という数字を思い浮かべたとします。このとき B さんが 4 1 5 9 という数字を選んだら、A さんは「1ヒット1ブロー」と答えます。 A さんの思い浮かべた4個の数字と、B さんが選んだ4個の数字を入力してヒットとブロー数の数を出力するプログラムを作成して下さい。ただし、4個の数字は0から9の範囲で、すべて異なります 各データセットに対して、ヒット数とブロー数を1行に出力して下さい。なお、ヒット数とブロー数は1つのスペースで区切って下さい。 入力データ 9 1 8 2 4 1 5 9 4 6 8 2 4 6 3 2 予想結果 1 1 3 0 <?php while ($data = trim(fgets(STDIN))) { $list[] = $data; } $list = preg_replace("/( | )/", "", $list); $count = (count($list)/2); $array_a = []; $array_b = []; $i = 1; foreach ($list as $value) { if ($i % 2 !== 0) { $array_a[] = $value; } else { $array_b[] = $value; } $i++; } $j = 0; while ($count > 0) { $hit = 0; $bro = 0; for ($i=0; $i < 4; ++$i) { $a_dset = substr($array_a[$j], $i, 1); $b_dset = substr($array_b[$j], $i, 1); if ($a_dset == $b_dset) { $hit = $hit + 1; } else { $strpos = strpos($array_a[$j], $b_dset); if (is_numeric($strpos)) { $bro = $bro + 1; } } } echo $hit." ".$bro."\n"; $count = $count - 1; $j++; } ?>
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【PHP】基本文法メモ 配列

基本的なPHPの文法についてメモっておく。 対話モードで色々な文法を試す $ php -a PHP > 対話モードが立ち上がる。 配列 PHP > $animals = ["dog", "wani", "gorira"]; php > echo $animals; PHP Notice: Array to string conversion in php shell code on line 1 Array php > echo $animals[1]; wani こんな感じで配列を定義することができる。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel 8.40にEloquentリリーションwithOnly関数到着

概念 モデルを取得するときに、常にいくつかのリレーションをロードしたい場合は、モデルの$withプロパティで定義出来ますが、このPRでデフォルトのEagerロードをオーバーライドして、$withプロパティ内のすべてのアイテムを取得せず、withOnlyで定義されているリレーションのみ取得することができるようになりました。 セットアップ ジュースの管理システムを例にして、ジュース、ジュースのメーカー(作っている会社)と種類(トマト、アップルなどなど)のモデルでそれぞれの適切な情報を管理する。その上この例のサービスの仕組みではジュースのモデルのデータを取得するとき、ほぼ全ての場合においてメーカーの情報も必要となります。(たとえばメーカーの名前を表示することなど)。そのためジュースのモデルの$withで定義することになって、デフォルトでloadすることにします。 このようなジュースのモデルは下記のようになります。 <?php namespace App\Models; use Illuminate\Database\Eloquent\Model; /** *ジュースモデル * */ class Juice extends Model { /** * 常にデフォルトとしていつも取得するリレーション定義 * * @var array */ protected $with = ['maker']; /** * このJUICEを作っている会社 */ public function maker() { return $this->belongsTo(Maker::class); } /** * JUICEの種類 */ public function type() { return $this->belongsTo(Type::class); } } デフォルトでmakerがていぎされていますので、取得する時メーカーの情報が自動的にジュースモデルと一緒に取得されます $juice = App\Models\Juice::first(); // メーカーのリレーションも取得される App\Models\Juice { id: 1, name: 'めっちゃおいしいジュース' maker_id: 1, type_id: 1, ... maker: App\Models\Maker { id: 1, name: 'いい会社なまえ', .... }, } withOnlyの使い方 typeを引数としてwithOnlyの関数にわたして、メーカー(デフォルトでロードされるリレーション)の情報が取得されなくなります。 $juice = App\Models\Juice::withOnly('type')->first(); // メーカーのリレーション取得しない // 種類のリレーションがロードされる App\Models\Juice { id: 1, name: 'めっちゃおいしいジュース' maker_id: 1, type_id: 1, ... type: App\Models\Type { id: 1, type_name: 'オレンジ', .... }, } 複数のリレーションを取得したいときにはwithOnlyにリレーションの名前の配列を渡すことができます(デフォルトのEagerロードで定義されているリレーションでも可能)。空の配列の場合、すべてのリレーションが取得しないようになります。 $juice = App\Models\Juice::withOnly(['type', 'maker'])->first(); // メーカーと種類のリレーションどっちも取得 App\Models\Juice { id: 1, name: 'めっちゃおいしいジュース' maker_id: 1, type_id: 1, ... type: App\Models\Type { id: 1, type_name: 'オレンジ', .... }, maker: App\Models\Maker { id: 1, name: 'いい会社なまえ', .... }, } まとめ $withプロパティ内のリレーションを除外でき、withOnlyの関数の引数にわたされているリレーションのみ取得することが簡単にできます。 三章 https://github.com/laravel/framework/pull/37144 https://laravel.com/docs/8.x/eloquent-relationships#eager-loading-by-default
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【PHP】【個人開発】SNSぽいサービス

PHPでSNSに近いサービスを開発しました。 投稿、フォロー、メッセージ等の基本的な機能を実装しています。 URL GitHub 使用技術 ・フロントエンド - HTML - CSS - Javascript ・バックエンド - PHP - FWなし ・インフラ/開発環境 - heroku - Mysql - VScode - Git/GitHub 実装機能 メッセージ機能 ユーザー同士のやり取りはもちろん、新規メッセージがあるときはログイン時にフラッシュメッセージで通知するようになっています。 モーダルウィンドウ 投稿、コメント等を送信する際に出力され、UIを高めるため実装しました。 ページネーション 投稿、ユーザー一覧画面にて複数のページで分割できるよう実装しました。 メディアクエリ ウィンドウサイズに合わせて、レイアウトが崩れないようメディアクエリを実装しました。 その他機能 その他、さまざまな機能が実装されています。 ・いいね ・フォロー ・コメント ・投稿 ・検索 ・ユーザー新規登録 ・ユーザーログイン ・テストログイン ・一覧表示(ユーザー/投稿) ・詳細表示(ユーザー/投稿) ・更新(ユーザー/投稿) ・削除(ユーザー/投稿/コメント/メッセージリスト) 終わりに 実務でPHPを使用しているため、学習も兼ねてFWなしで個人開発しました。 生のPHPで開発することで、内部の処理まで確認することができたのでとても勉強になりました。 これからもいくつか個人開発を続けたいと思います。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

LaravelでPHP Fatal error: Allowed memory size of 1610612736 bytes exhausted...エラー

Laravelでデバックバーをインストールしようとしたらエラー出ました。 原因は別件でphpのバージョンを変えたのでその影響でした。 忘れないように忘備録。。 コンソール composer require barryvdh/laravel-debugbar (*゚▽゚)ノ ターン いつものようにデバックバーをインストールだっ コンソール PHP Fatal error: Allowed memory size of 1610612736 bytes exhausted ... (;´Д`) あれなんか急にエラー出た。。。 調べたらComposerのメモリ不足エラーみたいでした。。 php.iniの設定変更で治るみたいなので場所を調べたら コンソール $ php --ini | grep "php.ini" ↓ コンソール Loaded Configuration File:/usr/local/etc/php/7.4/php.ini ( ノД`) そういや別件でphpのバージョン変えてた・・ php.ini memory_limit = -1 この変更で治りました。 参考にしました。 https://qiita.com/miriwo/items/a5fa25c1d36d00f40ec9 https://qiita.com/miriwo/items/acb49b0a97b5d5fa47fd
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む