20210509のPHPに関する記事は16件です。

laravel ビューファイルが存在していることを確認する

目的 ビューファイルが存在しているかどうかを判定する方法をメモ的にまとめる 方法 下記のようにコントローラーなどに記載することで指定したビューファイルが存在しているか判定する事ができる。 // ファイル上部のエイリアス作成の部分に下記を記載する use Illuminate\Support\Facades\View; $viewFlag = View::exists('ビューファイル名'); Viewファサードのexistsメソッドは引数として指定されたビューファイルが存在しているときにtrueを、存在していないときにfalseを返す。 下記のように記載することでビューファイルの有無で処理を分ける事ができる。 // ファイル上部のエイリアス作成の部分に下記を記載する use Illuminate\Support\Facades\View; if (View::exists('ビューファイル名')) { // ビューファイルが存在していた時の処理 } else { // ビューファイルが存在していなかった時の処理 }; 参考文献 https://readouble.com/laravel/8.x/ja/views.html
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

実務未経験がSNSサービスを作ってみた

はじめに 私は2020年8月からphp、11月頃からLaravelを勉強し始めました。今までは、勉強の中で、ECサイトや掲示板などを作成して1からCRUD処理ができるレベルになりました。今回は、学習のアウトプットと自分の思い描くサービスを作ってみたいと考え、SNSサービスを作成した記録を残します。 環境 制作期間は1ヶ月ほど  勉強時間は最低平日2時間、休日6時間 htmlとcssは最低限しか分からないです。 スキル MAMP/php/Laravel5.5/mysql/git/vim/linux 作ってみたもの WEBアプリ名 Destiny 保険 目的 保険が大好きで優柔不断な日本人に後悔のない保険選びをサポートすること 内容 保険の悩みを共有するSNSです。会員登録したユーザーは保険に対して抱えている悩みを投稿することができます。他のユーザーからコメントでアドバイスを受けることができます。プロフィール欄も充実しているためユーザーが保険のプロなのか?同じような悩みをかける主婦なのか?すぐに分かる事ができます。気になったユーザーがいた場合はチャット機能で2人だけの会話を頼むことができます。より深い内容の提案を受けることを期待できます。 機能 全ユーザー ・投稿を見ることができる ・コメントに「いいね」評価をいただけた数ランキングを見ることができる ・管理者にお問い合わせをすることができる ・悩み投稿を検索することができる。 会員登録したユーザーのみ ・保険に対する悩みを投稿することができる ・ユーザーの投稿にコメント(アドバイス)をすることができる。 ・他のユーザーとチャットすることができる ・投稿についたコメントを確認することができる ・プロフィール機能 投稿したユーザーのみ ・投稿を削除することができる ・投稿のコメントに「いいね」をすることができる 管理者のみ ・全ユーザー確認機能 ・全お問い合わせ確認機能 ・対応したお問い合わせのステータスを変更機能 トップ画面 悩み投稿の一覧ページ 保険の投稿をクリックすると詳細画面 保険の悩みを投稿するページ 個人的に気に入っている点 ・フッター 黒と白を貴重にしたシンプルなデザインと人生初のcopyrightがかっこいい、、 ・デフォルトのプロフィール写真 プロフィール写真を設定していないとかわいいピカチュウのシルエット写真になります。遊び心を入れました。 ・「Destiny 保険」というサービス名 反省点 各作業にかかった時間計測していない fatコントローラー cssがきたない サービスに導入したいこと 提案書作成機能 レスポンシブ対応 非同期通信 リファクタリング サーバーに公開する流れ xserverで公開する際に参考にした記事を参考に公開しました。 少しだけ躓いた場面があります。 ①ssh接続時  公開鍵の権限を600に変更すること サーバーIDはメールで送られてくるIDとは違うこと(エックスサーバーと契約すると様々なIDがあるため勘違いしてログインに失敗しました) ssh接続時に参考にした記事 ②サーバー公開後にローカルからimageデータをリモートサーバーに移す時 FTPのログインするときに設定を何度も間違えたせいで、ログインできなくなりました。 xserver公式のFTPに関するQ&A そのため、VSCodeでRemote sshで接続して、ローカルにあるimageフォルダーをドラッグアンドドロップで移動させました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

予期せぬ連敗でレートが溶けても気にしなくていいかもしれない話

はじめに Twitterのフォロワーにオセロ競技者が多いのでオセクエ 1 廃人のツイートをよく見かけます? 上下するレーティングに一喜一憂したり、連敗でレートが溶けることにストレスを感じている方が多いように感じます?? 『気にしなくていいんですよ。意外と知られていない。』 とか言っても信じてもらえないので検証してみましょう❗️? さっそく本題 シミュレーション内容 前提 適正レートは1700とする 週に300回対局するオセクエ廃人 ケース① 予期せぬ連敗でレートが1600まで落ちる? その後レート1700の相手と300連戦(勝ち負けを交互に繰り返す)2 ケース② 連敗しなかった世界線? レート1700の相手と300連戦(勝ち負けを交互に繰り返す)2 → 300連戦後のレートを比べてみる❗️✊? レーティング計算ロジック レーティングの計算はイロレーティングでやります?✨ [ご参考] ※多くの対戦ゲームやオセロ連盟レーティングはイロレーティングをベースに色々手が加えられているので完全に同じ結果にはならないと思います? プログラム PHPで実装しました?‍? <?php // 想定勝率 function winRate($myRating, $opponentRating) { return 1 / (10 ** (($opponentRating - $myRating) / 400) + 1); } // レーティング計算 function rating($myRating, $opponentRating, $isWinning) { $winRate = winRate($myRating, $opponentRating); return $isWinning ? $myRating + (1 - $winRate) * 16 : $myRating - $winRate * 16; } // 検証開始時のレーティング $myRating = 1600; // レーティング1700の相手と300回対戦する(交互に勝ち負けを繰り返すだけ) for ($i = 0; $i < 300; $i++) { $isWinning = $i % 2; $myRating = rating($myRating, 1700, $isWinning); } echo $myRating; // 1703.9490319962 結果 ケース①(連敗したあとに300戦) → 1703.9490319962 ケース②(連敗しないで300戦) → 1704.0428496813 なんと0.1しか変わりませんでした?? 1週間対局すれば連敗は実質無かったことになります?? これで心置きなく連敗できますね❗️?…❓? 無料で世界ランカーレベルのオセラーとも対戦できる神ゲー オセロクエスト ↩ レート1700の対戦相手は毎回別の人と仮定する ↩
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

商品追加機能の実装について【NULL】

はじめに はじめまして! webエンジニア転職を目指して三ヶ月が経ちました。 スクールでは共同開発が始まり、カート機能を実装しております。 そこで、終盤において商品追加機能を担当し、 復習&アウトプットも兼ねてご覧の皆さんに共有したいと思い、記事投稿に至ります! 至らぬ点が多々あるとは思いますが、何かの実装の参考になれば幸いです。? 0, 目次 1, 概要 2, 環境 3, 参考テーブル 4, 【null値許容】の設定 参考にしたサイト 1, 概要 DB確認(Tinker) 本記事では、前回実装した商品データを元にDBへnull値も含めて追加していきたいと思います。 前回:【Laravel】商品追加機能の実装について 今回:↓ ・ id:16 の商品を追加 ・ null設定3箇所 2, 環境 macOS Big Sur 11.2.2  Apache 2.4.46  MySQL 5.7  PHP 7.2.34 Laravel 5.8   実は今回、共同開発において VirtualBoxを用いたVagrantによる仮想開発環境で統一したかったのですが、 投稿主のmacが最近出たばかりのM1チップが搭載されております。 そして、悲しいことに当時(2月中旬)はVirtualBoxなどバージョンが追いついておらず、 仕方なくAWS(Could9)での環境設定を余儀なくされました。。 3, 参考テーブル テーブルは事前に作ってあると思います。 今回の内容では、こちらのファイルの中身を変更する必要はありません。 カラム名など確認する際の参考として一応載せておきます。 ××××_××_××_××××××_create_m_products_table.php <?php use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateMProductsTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('m_products', function (Blueprint $table) { $table->increments('id'); $table->string('product_name', 64); $table->unsignedInteger('category_id'); $table->integer('price'); $table->string('description', 256); $table->unsignedInteger('sale_status_id'); $table->unsignedInteger('product_status_id'); $table->timestamp('regist_date'); $table->unsignedInteger('user_id'); $table->char('delete_flag', 1)->default(0); $table->foreign('user_id')->references('id')->on('m_users')->onDelete('cascade'); $table->foreign('category_id')->references('id')->on('m_categories')->onDelete('cascade'); $table->foreign('sale_status_id')->references('id')->on('m_sale_statuses')->onDelete('cascade'); $table->foreign('product_status_id')->references('id')->on('m_product_statuses')->onDelete('cascade'); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('m_products'); } } 4, 【null値許容】の設定 $ make:migration --table (作ったテーブル名) change_(作ったテーブル名)_table Created Migration: ××××_××_××_××××××_change_m_products_table これでchangeテーブルが作成されました。 ファイルを開いたら、 ▶︎upメソッド ▶︎downメソッド それぞれにnull許容(変更)の設定をしていきます。 ××××_××_××_××××××_change_m_products_table <?php use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class ChangeMProductsTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::table('m_products', function (Blueprint $table) { // それぞれのカラムにNULLを許容 $table->unsignedInteger('category_id')->nullable()->change(); $table->unsignedInteger('sale_status_id')->nullable()->change(); $table->unsignedInteger('product_status_id')->nullable()->change(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::table('m_products', function (Blueprint $table) { //カラム削除 $table->dropColumn(['category_id']); $table->dropColumn(['sale_status_id']); $table->dropColumn(['product_status_id']); }); } } と、ここでエラーが出てくるかと思います。 こちらは別記事でまとめてます。 簡単に解決できますので、こちらを参考にしてみてください!↓ 参考:composer.jsonのエラーについて 以上でnull値としてDBに登録できたかと思います! 参考にしたサイト •  Laravel 5.8 データベース:マイグレーション •  LaravelのMigrateでカラムにNULLを許容したり許容しなかったり変更 •  Laravel MySQL 既存カラムのNULL許容とデフォルト値をNULLに設定する
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravelを調べる:Docker起動編

Laravelを調べる: Docker起動編 2021/05/09 : ただいま編集中です! 環境 Name Version OS macOS Catalina (ver 10.15.7) docker desktop version 3.2.2 準備 Docker Desktopがインストールされていれば、以下のコマンドで使い始めることが可能。(簡単!) # mysql、pgsql、mariadb、redis、memcached、meilisearch、selenium、mailhog # default : mysql、redis、meilisearch、mailhog、selenium $ curl -s "https://laravel.build/example-app?with=mysql,redis" | bash $ cd example-app $ ./vendor/bin/sail up sailコマンドでの実行/停止 実行 # フォアグラウンドで実行 $ ./vendor/bin/sail up # # バックグラウンドで実行 $ ./vendor/bin/sail up -d 停止 $ ./vendor/bin/sail down 動作確認 ./vendor/bin/sail up を実行した状態で http://localhost/ にアクセスするとLaravelのページが表示される。 起動してからsailコマンドでできること シェルを起動 $ ./vendor/bin/sail shell mysqlにログイン $ ./vendor/bin/sail mysql 展開されたファイル 展開されたファイルのうち、頻繁に使うと思われるディレクトリ (app, config, database, routes) の内容をリストアップしておく。 すでに app/Models/User.php と 2014_10_12_000000_create_users_table.php がある点に注意。 このままmidgrateするとデフォルトの状態でUserテーブルが作られる。 % tree app app ├── Console │   └── Kernel.php ├── Exceptions │   └── Handler.php ├── Http │   ├── Controllers │   │   └── Controller.php │   ├── Kernel.php │   └── Middleware │   ├── Authenticate.php │   ├── EncryptCookies.php │   ├── PreventRequestsDuringMaintenance.php │   ├── RedirectIfAuthenticated.php │   ├── TrimStrings.php │   ├── TrustHosts.php │   ├── TrustProxies.php │   └── VerifyCsrfToken.php ├── Models │   └── User.php └── Providers ├── AppServiceProvider.php ├── AuthServiceProvider.php ├── BroadcastServiceProvider.php ├── EventServiceProvider.php └── RouteServiceProvider.php % tree config config ├── app.php ├── auth.php ├── broadcasting.php ├── cache.php ├── cors.php ├── database.php ├── filesystems.php ├── hashing.php ├── logging.php ├── mail.php ├── queue.php ├── services.php ├── session.php └── view.php % tree database database ├── factories │   └── UserFactory.php ├── migrations │   ├── 2014_10_12_000000_create_users_table.php │   ├── 2014_10_12_100000_create_password_resets_table.php │   └── 2019_08_19_000000_create_failed_jobs_table.php └── seeders └── DatabaseSeeder.php % tree routes routes ├── api.php ├── channels.php ├── console.php └── web.php 参考 Laravelとの出会い
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【migrationエラー】RuntimeException : Changing columns for table...の解決法

エラー文 RuntimeException : Changing columns for table "(テーブル名)" requires Doctrine DBAL; install "doctrine/dbal". 原因 このようなエラーはnull設定などでカラム削除時に起きてしまうものだと思われます。 Laravelの公式にも書いてありますが、 カラムを削除する際はマイグレーションする前に「composer.json」ファイルにとある依存パッケージを追加する必要があるとのことです。 追加して更新するだけなので、軽く以下にまとめます。 解決法 エラー文通り以下の作業を行います。 ① 「composer.json」ファイルにdoctrine/dbalを追加 composer.json { "name": "laravel/laravel", "type": "project", "description": "The Laravel Framework.", "keywords": [ "framework", "laravel" ], "license": "MIT", "require": { "php": "^7.1.3", "fideloper/proxy": "^4.0", "laravel/framework": "5.8.*", "laravel/tinker": "^1.0", "doctrine/dbal": "v2.4.2" <-これ }, "require-dev": { ---以下省略--- あとはcomposerをアップデートするだけ。 composer update 以上で正常にマイグレーションできるかと思います。 一応自分用メモのつもりですが、何かの参考になれば幸いです! 参考にしたサイト •  composer =laravelに依存関係をインストール •  Laravel 5.8 データベース:マイグレーション
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

<button>でhref=が使えない!??【解決】

はじめに こんにちは、超初学者のなかむーです。 スクールで学んだ知識や経験などを記事を通してアウトプットしています。 今回は「buttonタグにリンク移動できるのか?」というタイトルですが、 結論から言うとYesです! < a > と href="#" a タグでは以下のようにすることで遷移できる。 <a href="signup">新規登録</a> "/signup"でも遷移できます。 < button > と href="#" buttonタグでは以下のようにすることで遷移できる。 <button onclick=location.href="signup">新規登録</button> onclick=location.を後ろに合体させるだけですね! そして、これはJavaScriptで使われているものらしいですね。 aタグでは href属性(HTML) buttonタグでは onclick属性(JavaScript) フォームの中でリンク移動が可能になるので、便利だなぁと感じました。? 引用 : HTMLでbuttonタグを使ってリンクを貼る方法を現役エンジニアが解説【初心者向け】 ちなみに href は「エイチレフ」と読むみたいです。 恥ずかしながら、この課題に出会うまで知りませんでした...笑 至って簡単で単純ですぐ終わってしまいますが、実際に使用したところです!何かの参考になれば幸いです。?‍♂️ <div class="row justify-content-center mt-5"> <div class="col-4 text-center"> <h3>まだアカウントを<br>お持ちでない方はこちら</h3> <button type="button" class="btn btn-primary mt-5" onclick=location.href="signup" style="width:120px;height:50px">新規登録</button> </div> <div class="col-4 text-center"> <h3>すでにアカウントを<br>お持ちの方はこちら</h3> <button type="button" class="btn btn-primary mt-5" onclick=location.href="login" style="width:120px;height:50px">ログイン</button> </div> </div> 参考文献 •  HTMLでbuttonタグを使ってリンクを貼る方法を現役エンジニアが解説【初心者向け】
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MySQLのDB確認・作成コマンド【一覧】

mysqlに関するコマンドを毎度のこと調べてたので、『mysqlならここからコピペや!!』って感じで、自分用に見やすくまとめてみました。 要するに“コピペ用”です? MySQL接続コマンド ? MySQLのサービスに入る mysql -u root -p ? 入れなかった場合 //mysqlの起動 sudo service mysqld start //MySQLの再起動 sudo service mysqld restart //MySQLの確認 sudo service mysqld status //MySQLの停止 sudo service mysqld stop MySQLデータベースの作成 ・ 削除 ? データベースの作成と削除 //データベースの作成 create database データベース名; //データベースの削除 drop database データベース名; ? その他の作成と削除 //テーブルの作成 create table テーブル名(カラム名 データ型, カラム名 データ型); //テーブルの削除 drop from テーブル名; //データの削除 delete from テーブル名; (注意) ハイフン( - )が入るものは作れない。 アンダーバー( _ )ならOK。 MySQLデータベース確認 ? データベース名一覧表示(テーブルも同様) show databases; ? 現在のデータベース表示 select database(); ? データベース内のテーブル一覧表示 show tables from データベース名; ? データベース内のカラム一覧表示 show columns from テーブル名 from データベース名; MySQL格納データ確認 ? データベースに接続する use データベース名; ? 格納データを表示する select * from テーブル名; 自分用にまとめたものですが、何かの役に立てば幸いです!?
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel】商品追加機能の実装について

はじめに はじめまして! webエンジニア転職を目指して三ヶ月が経ちました。 スクールでは共同開発が始まり、カート機能を実装しております。 そこで、終盤において商品追加機能を担当し、 復習&アウトプットも兼ねてご覧の皆さんに共有したいと思い、記事投稿に至ります! 至らぬ点が多々あるとは思いますが、何かの実装の参考になれば幸いです。? 目次 1, 完成品 2, 環境 3, 使用するソースコード   3-① Route   3-② Controller   3-③ View   3-④ Migration   3-⑤ Model 4, 各実装の説明 ①〜⑤ 参考にしたサイト まとめ 1, 完成品 ① 完成画面 ② DB確認(Tinker) 2, 環境 macOS Big Sur 11.2.2  Apache 2.4.46  MySQL 5.7  PHP 7.2.34 Laravel 5.8   実は今回、共同開発において VirtualBoxを用いたVagrantによる仮想開発環境で統一したかったのですが、 投稿主のmacが最近出たばかりのM1チップが搭載されております。 そして、悲しいことに当時(2月中旬)はVirtualBoxなどバージョンが追いついておらず、 仕方なくAWS(Could9)での環境設定を余儀なくされました。。 3, 使用するソースコード 3 - ① Route web.php <?php /* |-------------------------------------------------------------------------- | Web Routes |-------------------------------------------------------------------------- | | Here is where you can register web routes for your application. These | routes are loaded by the RouteServiceProvider within a group which | contains the "web" middleware group. Now create something great! | */ Route::get('/', function () { return view('welcome'); }); //商品追加 Route::get('newAdd', 'NewAddController@index')->name('newAdd.index'); Route::post('newProduct', 'NewAddController@store')->name('newProduct.post'); 3 - ② Controller NewAddController <?php namespace App\Http\Controllers; use App\User; use App\Models\Product; use App\Models\Category; use App\Models\ProductStatus; use App\Models\Sale; use Illuminate\Http\Request; use App\Http\Requests\ProductRequests; use Illuminate\Support\Facades\Validator; use Illuminate\Support\Facades\Auth; use App\Http\Controllers\Controller; class NewAddController extends Controller { public function index(Request $request) { return view('products.newAdd', [ 'user' => Auth::user(), 'categories' => Category::all(), 'products_status' => ProductStatus::all(), 'sales' => Sale::all(), ]); } public function store(ProductRequests $request) { $newProduct = new Product; $newProduct->product_name = $request->product_name; $newProduct->description = $request->description; $newProduct->price = $request->price; $newProduct->category_id = $request->category_id; $newProduct->product_status_id = $request->product_status_id; $newProduct->sale_status_id = $request->sale_status_id; $newProduct->user_id = Auth::user()->id; $newProduct->save(); return view('welcome'); } } 3 - ③ View newAdd.blade.php @extends('layouts.app') @section('content') <main> <div class="page-header mt-5 text-center"> <h2>商品追加</h2> </div> <div class="row mt-5 mb-5"> <div class="col-sm-5 mx-auto"> <form method="POST" action="{{ route('newProduct.post') }}"> @csrf <div class="form-group-sm clearfix"> <label for="formGroupExampleInput2" class="mt-3 mb-0">商品名</label> <div class="product-info width-control"> <input type="text" name="product_name" class="content-half-width form-control-sm d-inline"> <!-- @if ($errors->has('product_name')) <div class="row justify-content-center"> <div class="cal-xs-4"> <span style="color:red">{{ $errors->first('product_name') }}</span> </div> </div> @endif --> </div> </div> <div class="form-group-sm clearfix"> <label for="formGroupExampleInput2" class="mt-3 mb-0">商品説明</label> <div class="product-info width-control"> <textarea name="description" class="content-width form-control-sm"></textarea> <!-- @if ($errors->has('description')) <div class="row justify-content-center"> <div class="cal-xs-4"> <span style="color:red">{{ $errors->first('description') }}</span> </div> </div> @endif --> </div> </div> <div class="form-group-sm clearfix"> <label for="formGroupExampleInput2" class="mt-3 mb-0">価格</label> <div class="product-info width-control"> <input type="text" name="price" class="content-half-width form-control-sm d-inline"> <!-- @if ($errors->has('price')) <div class="row justify-content-center"> <div class="cal-xs-4"> <span style="color:red">{{ $errors->first('price') }}</span> </div> </div> @endif --> </div> </div> <div class="form-group-sm clearfix"> <label for="formGroupExampleInput2" class="mt-3 mb-0">商品カテゴリー</label> <div class="product-info width-control"> <select class="content-half-width form-control-sm d-inline" id="changeSelect" name="category_id" onchange="entryChange2();"> <option value="">未選択</option> @foreach ($categories as $category) <option value="{{ $category->id }}">{{ $category->category_name }}</option> @endforeach <!-- @if ($errors->has('category_id')) <div class="row justify-content-center"> <div class="cal-xs-4"> <span style="color:red">{{ $errors->first('category_id') }}</span> </div> </div> @endif --> </select> </dov> </div> <div class="form-group-sm clearfix"> <label for="formGroupExampleInput2" class="mt-3 mb-0">商品状態</label> <div class="product-info width-control"> <select class="content-half-width form-control-sm d-inline" id="changeSelect" name="product_status_id" onchange="entryChange2();"> <option value="">未選択</option> @foreach ($products_status as $product_status) <option value="{{ $product_status->id }}">{{ $product_status->product_status_name }}</option> @endforeach <!-- @if ($errors->has('product_status_id')) <div class="row justify-content-center"> <div class="cal-xs-4"> <span style="color:red">{{ $errors->first('product_status_id') }}</span> </div> </div> @endif --> </select> </dov> </div> <div class="form-group-sm clearfix"> <label for="formGroupExampleInput2" class="mt-3 mb-0">販売状態</label> <div class="product-info width-control"> <select class="content-half-width form-control-sm d-inline" id="changeSelect" name="sale_status_id" onchange="entryChange2();"> <option value="">未選択</option> @foreach ($sales as $sale) <option value="{{ $sale->id }}">{{ $sale->sale_status_name }}</option> @endforeach <!-- @if ($errors->has('sale_status_id')) <div class="row justify-content-center"> <div class="cal-xs-4"> <span style="color:red">{{ $errors->first('sale_status_id') }}</span> </div> </div> @endif --> </select> </dov> </div> <div class="text-center mt-5"> <button type="submit" class="btn btn-primary w-50">追加</button> <p class="mt-5"> <a href="#" class="text-primary d-inline">商品一覧</a> </p> </div> </form> </div> </div> </main> @endsection 3 - ④ Migration ××××_××_××_××××××_m_products_table.php <?php use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateMProductsTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('m_products', function (Blueprint $table) { $table->increments('id'); $table->string('product_name', 64); $table->unsignedInteger('category_id'); $table->integer('price'); $table->string('description', 256); $table->unsignedInteger('sale_status_id'); $table->unsignedInteger('product_status_id'); $table->timestamp('regist_date'); $table->unsignedInteger('user_id'); $table->char('delete_flag', 1)->default(0); $table->foreign('user_id')->references('id')->on('m_users')->onDelete('cascade'); $table->foreign('category_id')->references('id')->on('m_categories')->onDelete('cascade'); $table->foreign('sale_status_id')->references('id')->on('m_sale_statuses')->onDelete('cascade'); $table->foreign('product_status_id')->references('id')->on('m_product_statuses')->onDelete('cascade'); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('m_products'); } } 3 - ⑤ Model Product.php <?php namespace App\Models; use Illuminate\Database\Eloquent\Model; class Product extends Model { protected $table = 'm_products'; public $timestamps = false; //商品追加のホワイトリスト protected $fillable = [ 'product_name', 'description', 'price', ]; // Userモデルを親に持つことを明記 public function user() { return $this->belongsTo('App\User'); } // Categoryモデルを親に持つことを明記 public function category() { return $this->belongsTo('App\Models\Category'); } // Saleモデルを親に持つことを明記 public function sale() { return $this->belongsTo('App\Models\Sale'); } // ProductStatusモデルを親に持つことを明記 public function productstatus() { return $this->belongsTo('App\Models\ProductStatus'); } } 他のモデルについては同様の処理(リレーション)のため、今回は割愛させて頂きます。?‍♂️ 当時の私は、下記サイトを参考に実装していました。 参考 : リレーションについて 4, 各実装の説明 ①〜⑤ 4 - ① Route web.php //商品追加 Route::get('newAdd', 'NewAddController@index')->name('newAdd.index'); Route::post('newProduct', 'NewAddController@store')->name('newProduct.post'); こちらでは Route::getでViewを呼び出しています。(indexメソッド) Route::postでDBへの登録をしています。(storeメソッド) それぞれメソッド、命名など異なりますので、読み間違え等に気をつけましょう。 4 - ② Controller NewAddController.php public function index(Request $request) { return view('products.newAdd', [ 'user' => Auth::user(), 'categories' => Category::all(), 'products_status' => ProductStatus::all(), 'sales' => Sale::all(), ]); } 完成品を確認して頂くと、[カテゴリー] [商品状態] [販売状態] が選択になっています。 なので、indexメソッドでは各Modelを通して 登録する [ユーザー情報] や選択肢で表示させるための [3つの情報] を取得し、Viewに渡します。 また、今回はそこまで複雑な処理ではないため上のように記述しましたが、 以下のようにcompact関数を使っても問題なく渡すことができます! NewAddController public function index(Request $request) { $user = Auth::user(); $categories = Category::all(); $products_status = ProductStatus::all(); $sales = Sale::all(); return view('products.newAdd', compact('categories', 'user', 'sales', 'products_status')); } 次にstoreメソッドですが、 NewAddController public function store(ProductRequests $request) { $newProduct = new Product; $newProduct->product_name = $request->product_name; $newProduct->description = $request->description; $newProduct->price = $request->price; $newProduct->category_id = $request->category_id; $newProduct->product_status_id = $request->product_status_id; $newProduct->sale_status_id = $request->sale_status_id; $newProduct->user_id = Auth::user()->id; $newProduct->save(); return view('welcome'); } public function store(ProductRequests $request) こちらの ProductRequests はフォームリクエストによるバリデーションをかけています。 今回の実装ではバリデーションについての解説は入れてませんので、 Request に書き換えてもらってOKです! $newProduct = new Product; ここの一文は「これからProductモデルに新しい値を追加していくよー」っていう感じです。笑 あとは $newProduct という変数に画面で入力(選択)した値が格納されていくようになっています。 よくエラーが起きてしまう原因...?↓↓↓ <?php namespace App\Http\Controllers; use App\User; use App\Models\Product; use App\Models\Category; use App\Models\ProductStatus; use App\Models\Sale; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use App\Http\Controllers\Controller; Controller上部ではモデルやリクエストインスタンスを持ってきているので、 ここが一つでも抜けていると does not exit エラーが起きてしまいます...。 気が抜けないですね。。 5 - ③ View Viewについては 「入力値」と「選択値」の2種類があるので、分けて説明していきます。 と、その前に... <form method="POST" action="{{ route('newProduct.post') }}"> フォームタグでPOST送信の設定を忘れずに。 action="{{ route( ' 命名したルート名 ' ) }}" でルーティングしてあげます! ↓↓ 入力値 ↓↓ newAdd.blade.php「入力値」 <div class="form-group-sm clearfix"> <label for="formGroupExampleInput2" class="mt-3 mb-0">商品名</label> <div class="product-info width-control"> <input type="text" name="product_name" class="content-half-width form-control-sm d-inline"> <!-- @if ($errors->has('product_name')) <div class="row justify-content-center"> <div class="cal-xs-4"> <span style="color:red">{{ $errors->first('product_name') }}</span> </div> </div> @endif --> </div> </div> ここはControllerで指定したnameと一致させるための中にそのまま同じnameを入れてあげます。 フォームタグで囲ってあるので、あとは上記のようにHTMLで入力欄を作ればOKです! if文以降はエラー時のバリデーションを設定してます。 不要でしたら削除しても構いません。 ↓↓ 選択値 ↓↓ nweAdd.blade.php「選択値」 <div class="form-group-sm clearfix"> <label for="formGroupExampleInput2" class="mt-3 mb-0">商品カテゴリー</label> <div class="product-info width-control"> <select class="content-half-width form-control-sm d-inline" id="changeSelect" name="category_id" onchange="entryChange2();"> <option value="">未選択</option> @foreach ($categories as $category) <option value="{{ $category->id }}">{{ $category->category_name }}</option> @endforeach <!-- @if ($errors->has('category_id')) <div class="row justify-content-center"> <div class="cal-xs-4"> <span style="color:red">{{ $errors->first('category_id') }}</span> </div> </div> @endif --> </select> </dov> </div> 5 - ④ Migration 使用したソースコード参照 5 - ⑤ Model Product.php //商品追加のホワイトリスト protected $fillable = [ 'product_name', 'description', 'price', ]; $fillableで書き換えれるように設定しましょう。 ここでは使いませんが、$guardedはその逆です。 Product.php // Userモデルを親に持つことを明記 public function user() { return $this->belongsTo('App\User'); } // Categoryモデルを親に持つことを明記 public function category() { return $this->belongsTo('App\Models\Category'); } // Saleモデルを親に持つことを明記 public function sale() { return $this->belongsTo('App\Models\Sale'); } // ProductStatusモデルを親に持つことを明記 public function productstatus() { return $this->belongsTo('App\Models\ProductStatus'); } 各リレーションを行っています。 詳しくは下記リンクを参考に。 個人的にすごく分かりやすかったのでオススメします! 参考 : リレーションについて 参考にしたサイト •  DBの操作について(挿入) まとめ 以上で商品追加の機能を実装できるかと思います! DBへ新しいデータを登録する作業は初めてで、最初は色々記事などを漁りましたが、 ほとんど共同開発とスクール課題等で得た短い経験と知識ですんなり実装することができました! もっと記述を簡単にできたり、ここの書き方間違ってる等たくさんあるかとは思いますが、何かの参考になれば幸いです?‍♂️
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

備忘録:Laravel学習③

ログイン機能 認証用のルーティング追加 Auth::routes() ルーティング確認 php artisan route:list HEADメソッドとは GETとは違って、リソースのヘッダ情報のみを取得する web.phpとapi.phpについて どちらもルーティングを記載する場所だが、web.phpがcsrf保護が有効なのに対して、api.phpは無効(そもそもapiとして外からのリクエストを受けるので) 設定はApp\Http\Karnel.phpにある web.phpとapi.phpの違い トレイトとは Auth\RegistrationController.php use RegistersUsers; laravel/vendor/laravel/framework/src/Illuminate/Foundation/Auth/RegistersUsers.php trait RegistersUsers そのままではクラスとして利用できず、上のようにuseで使用を宣言 継承 →2つ以上のクラスを親から子へ継承することができない。 trait →useを使えばいくらでも当該クラスでトレイトの機能が使える。 rubyのdeviseと違って、Laravelでは登録用のviewテンプレートは用意されていない。 登録後の遷移先を変えたい場合 以下を編集 laravel/app/Providers/RouteServiceProvider public const HOME = '/home'; vendorディレクトリはcomposer installコマンドでPHPの各種ライブラリが配置される場所なので、基本編集しない。 バリデーション変えたい場合 laravel/app/Http/Controllers/Auth/RegisterController.phpのvalidatorメソッド内を編集 本来はユーザー登録の動作を繰り返し試すのであれば、まずテストコードを書いてテストをすべき ログイン後の遷移先を変えたい場合 loginコントローラーをオーバーライドする やり残したこと Laravelのイベントについて method_exists関数について bladeファイル作るコマンド作りたいなぁと思ってたら、やっているのがあったので、自分が開発する時になったら、使おうかな userの登録処理確認のテストコードの書き方 メアドのエラーメッセージ問題 疑問 formの選択肢はどこみて判断してるのか
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

laravelで短いUUIDをprimaryキーとして設定する。

ライブラリインストール。下記の二つ。 composer require goldspecdigital/laravel-eloquent-uuid //これはバージョンによって変える。 composer require pascaldevink/shortuuid マイグレーションの変更 usersテーブルのマイグレーション //$table->id(); $table->uuid('id')->primary(); モデルファイルの継承元の変更 Userモデルは下記のように。 User.php //use Illuminate\Foundation\Auth\User as Authenticatable; use GoldSpecDigital\LaravelEloquentUUID\Foundation\Auth\User as Authenticatable; それ以外は下記のように変更。 Userモデル以外。 use GoldSpecDigital\LaravelEloquentUUID\Database\Eloquent\Model; ちなみに下記が便利コマンド。 これでUUID用のモデルが作られる。 php artisan uuid:make:model [モデル名] 下記のように書けば作成時にuuidが設定される。 コントローラー use GoldSpecDigital\LaravelEloquentUUID\Database\Eloquent\Model; use Illuminate\Support\Str; use PascalDeVink\ShortUuid\ShortUuid; public function __construct(array $attributes = []) { parent::__construct($attributes); // newした時に自動的にuuidを設定する。 $uuid4 = Str::uuid(); $shortuuid = new ShortUuid(); $su_string = $shortuuid->encode($uuid4); $this->attributes['id'] = $su_string; }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

WordPressの投稿者情報をget_the_author_meta()関数で取得する

WordPressの投稿者情報を取得するためには <?php get_the_author_meta( $field, $user_id ); ?> で取得できる. $fieldは必須引数で$user_idはオプショナル.$user_idが指定されない場合,現在のユーザーが取得される. $field $fieldは管理画面が日本語なので指定方法がわからかった. $fieldは下記で指定する ID user_nickname | ニックネーム user_email | メール user_url | サイト user_description | プロフィール情報 user_firstname | 名 user_lastname | 性 参考にしたサイト
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravelのクエリスコープを試してみた

クエリスコープを使用するとクエリの使い回しができます。例えばCMSを構築していてほとんどのクエリに対して公開済みの記事を取得する制約を付けている場合、クエリスコープを使用することで自動的にこの制約を追加することができます。 Laravelのクエリスコープには、「グローバルスコープ」と「ローカルスコープ」の2種類あります。グローバルスコープはEloquentモデルを使用すると自動的に条件が追加され、ローカルスコープはあらかじめクエリを作成しておき条件を追加したいときに呼び出すことで使用できます。 事前準備 作成した記事の中からpublished = 1の記事を取得する条件をグローバルスコープ・ローカルスコープを用いて使用してみます。その準備としてarticlesテーブルにpublishedカラムを追加しpublished = 1のレコードを作成しておきます。 id use_id title slug body published created_at updated_at 1 1 My first article First article My first article is edited 0 2021-05-01 00:48:03 2021-05-01 04:02:55 2 2 Jack's article Jack's article This article is made by Jack 1 2021-05-01 00:48:43 2021-05-01 ローカルスコープ published = 1の条件をローカルスコープを使用して追加してみます。 ローカルスコープ定義 モデルにスコープを定義します。命名規約はメソッド名にscopeを付けることです。 Article.php public function scopePublished($query) { return $query->where('published', 1); } ローカルスコープの利用 定義したスコープ名からscopeプレフィックスを取り除いたメソッド名で呼び出せます。 ArticlesController.php public function index() { $articles = Article::published()->with('tags')->get(); return view('articles.index', ['articles' => $articles]); } 発行されたsqlにはきちんと"published" = 1が追加されています。 select * from "articles" where "published" = 1 グローバルスコープ 今度はグローバルスコープを用いて条件を追加してみます。 グローバルスコープの作成 Illuminate\Database\Eloquent\Scopeインターフェースのapplyメソッドを実装するクラスを作ります。 PublishedScope.php <?php namespace App\Scopes; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Scope; class PublishedScope implements Scope { /** * 指定のEloquentクエリビルダにスコープを適用 * * @param \Illuminate\Database\Eloquent\Builder $builder * @param \Illuminate\Database\Eloquent\Model $model * @return void */ public function apply(Builder $builder, Model $model) { $builder->where('published', '=', 1); } } グローバルスコープの適用 モデルのbootedメソッドをオーバーライドしてaddGlobalScopeメソッドを呼び出します。 Article.php protected static function booted() { static::addGlobalScope(new PublishedScope); } ローカルスコープと違い特に何も指定しなくても、Article Eloquent モデルを使用したクエリにはpublished = 1が追加されます。 ArticlesController.php public function index() { $articles = Article::with('tags')->get(); return view('articles.index', ['articles' => $articles]); } グローバルスコープの削除 あるケースではグローバルスコープのクエリを使用したくないということがあると思います。その場合はwithoutGlobalScopeメソッドを使用することでグローバルスコープを削除できます。 ArticlesController.php use App\Scopes\PublishedScope; public function index() { $articles = Article::withoutGlobalScope(PublishedScope::class)->with('tags')->get(); return view('articles.index', ['articles' => $articles]); }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

wordpressの公開URLを変更したい方、ご注意!巷の誤情報に惑わされないでください。

結論 wordpressの公開URLを変更したいと思い、ググって色々実施したものの、どうも上手くいかない。。。 そんなあなた、もしまだ以下を試していなければ、試してください。 以下の通りに設定する。(URLご自身のものに変えてくださいね) define( 'WP_SITEURL', 'http://example.com/wordpress/wp' ); →こっちが、管理ファイルのアドレス。 define( 'WP_HOME', 'http://example.com/wordpress' ); →こっちが、公開URL …僕はこれで解決しました。 本当にコンテンツSEOの弊害だと思うのですが、巷に流れている解説記事には、殆どが(僕が確認した限りではすべてが) 上記について逆で書かれています。 まぁ、公式の詳細まで確認しない僕も行けないのですが、、、。 詳細(公式から引用。) 日本語的に、SITEURLとHOMEって、意味合いが逆のように思ってしまうんですよね。 しかもどの記事もそういうふうに記載しているから、そりゃそう思い込んでしまう。 でも、逆でした。 WP_SITEURL #WP_SITEURL WP_SITEURL は WordPress アドレス (URL) を定義します。 ここで定義する値は、WordPress のコアファイルが存在する URL です。 http:// の部分は含める必要があります。最後のスラッシュ “/” は含めないでください。 wp-config.php でこの値を設定すると、 wp-options テーブルの値よりも優先されます。これを追加することで、サイトを読み込む時のデータベースの呼び出し回数を減らすことができます。 ドメイン名 example.com の wordpress ディレクトリに WordPress がインストールされている場合、 WP_SITEURL を次のように指定します。 define( 'WP_SITEURL', 'http://example.com/wordpress' ); ブログのアドレス (URL) #ブログのアドレス (URL) WP_HOME は WP_SITEURL と同様に wp_opsions テーブルの値よりも優先されますが、データベースの値は変更されません。 home は WordPress にアクセスするためにユーザーがブラウザに入力するアドレスです。 http:// の部分は含める必要があります。最後のスラッシュ “/” は含めないでください。 これを追加することで、サイトを読み込む時のデータベースの呼び出し回数を減らすことができます。 define( 'WP_HOME', 'http://example.com/wordpress' ); 公式
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ルーティングについて(Laravelでウェブアプリを作ろう)

ルーティングとは 特定のアドレスにアクセスした時、どの処理を呼び出して実行するか。それを管理するのが「ルーティング」です。実際の処理が記載されているというよりあくまでどの処理かの紐付けを行なっているだけです。具体的に実行すべき処理は「コントローラー」に記載されています。 前提条件 プロジェクトの作成が終わっている状態 まだ作成できていない方はこちら 実際のアプリでは プロジェクトの作成が完了すると以下のコマンドでサーバーを立ち上げてアプリを使うことができます。 サーバーの起動(ターミナル) php artisan serve 実行後に表示されるURLをブラウザで開くとLaravelのページが表示されると思います。 これはアプリ内のresouces/views/welcome.blade.phpが表示されている状態です。 このファイルを開く、という指定はroutes/web.php内に記載されています。 デフォルト(routes/web.php) <?php use Illuminate\Support\Facades\Route; //ここで「welcome」の指定がある Route::get('/', function(){ return view('welcome'); }); view関数で指定することで、自動的にresouces/views内のファイルという指定がされるというわけです。 例えば、view関数でファイルを分けずにweb.php内に直接htmlを記述することも可能です(本来はこういう使い方をすることはないが、動きの理解として。) view関数を使わずにべた書き(routes/web.php) Route::get('test', function () { return '<html><body><h1>Hello</h1><p>This is sample page.</p></body></html>'; } サーバーの起動後http://localhost:8000/testに接続すると記述した内容が表示されていることがわかる。 他にリクエストされた時のパラメーターを利用する方法もある。 必須パラメーターの利用(routes/web.php) Route::get('test/{str}', function ($str) { return '<html><body><h1>Hello</h1><p>This is sample page.</p><p>{$str}</p></body></html>'; } サーバーの起動後http://localhost:8000/test/好きな単語に接続すると好きな言葉に記載した内容が表示されていることがわかる。上記のパラメーターは「必須パラメーター」というもので記載しないとエラーになります。対して「任意パラメーター」の書き方は以下のように「?」をつける+デフォルト値を設定するだけです。 任意パラメーターの利用(routes/web.php) Route::get('test/{str?}', function ($str='no contents.') { return '<html><body><h1>Hello</h1><p>This is sample page.</p><p>{$str}</p></body></html>'; }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

備忘録:Laravel学習②

手始めにdocker-composeコマンド コンテナの状態確認とログ確認 docker-compose ps/logs コンテナ状態を確認するとstateがExit255に、 docker-compose up -d でコンテナを起動して対応 bladeファイルでの改行表示 {!! nl2br(e($value)) !!} 改行文字\nの前にHTMLの改行タグ(<br>)を挿入する nl2br() 特殊文字(<br>)をエスケープしないようにする  {!! !!} <br>以外をエスケープさせる e() 別ビューの読み込み @include('ファイル名') PostgreSQLでのDB作成 docker-compose exec workspace psql -U default -h postgres psqlはmysqlみたいなもの -U:ユーザー指定 -h: ホスト指定 DB作って、.envで環境変数設定へ 外部キー制約/migration migraiotnファイルで $table->bigInteger('user_id')->references("id")->on('users'); 該当テーブルのuser_idはusersテーブルに存在する値しか入れることができない。 ちなみに、created_atとかはtime_stamps()で自動生成 migrationの実行 $ docker-compose exec workspace php artisan migrate モデル作成 $ docker-compose exec workspace php artisan make:model モデル名 $article->user; //-- Userモデルのインスタンスが返る $article->user->name; //-- Userモデルのインスタンスのnameプロパティの値が返る $article->user->hoge(); //-- Userモデルのインスタンスのhogeメソッドの戻り値が返る $article->user(); //-- BelongsToクラスのインスタンスが返る 感想 MDB面白い、色々試してみる。 Rubyをある程度やっていたので、よく理解できる。 相変わらずORMは便利だなぁとしみじみ、
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む