20220402のlaravelに関する記事は10件です。

月別記事一覧と、投稿数表示機能

目次 1.月別集計 2.月別ページ表示 Laravelを使ったブログサイト作成で、月別記事一覧と投稿数を表示させる機能を作ったのでアウトプット記事書いてみます。 ↓ 最終目標はこんな感じです 1. 月別集計 流れとしては、公開中の記事から指定した年の記事を取得し、月別取得&投稿数取得。 あとは blade側で @foreach を使って月と投稿数を表示させていく感じです! where('is_published', 1) を書かないと非公開記事まで表示されてしまうので注意です! PostController.php public function index(): View { ...省略 $year = date('Y'); $monthPosts = $this->Post->findMonthPostCount($year); return view( 'posts.index', [ 'year' => $year, 'monthPosts' => $monthPosts, ] ); } Post.php public function findMonthPostCount($year): Collection { return Post::where('is_published', 1) ->whereYear('created_at', $year) ->orderBy('created_at') ->get() ->groupBy(function ($row) { return $row->created_at->format('m'); //月別取得 }) ->map(function ($day) { return $day->count(); //投稿数取得 }); } index.blade.php ...省略 <h1 class="month-title">月別記事</h1> <button class="button">{{$year}}</button> <div class="card-month"> @foreach($monthPosts as $month => $count) <li class="li-month"> <a href="{{ route('posts.month', [$year, $month]) }}"> {{$year}}/{{ $month }} ({{$count}}) </a> </li> @endforeach これを表示させてみると、こんな感じです! 投稿がある月だけ表示されるのでとても見やすいと思います! 例えば、追加で5月の記事を投稿してみた場合、 こんな感じで5月の記事が追加されます! そのまま URL になっているのでクリックで月別記事一覧に飛べます! <a href="{{ route('posts.month', [$year, $month]) }}"> {{$year}}/{{ $month }} ({{$count}}) </a> 2. 月別ページ表示 月別ページの表示は、 $year $month を引数で渡してあげて指定した月を取得すればOKです! PostController.php public function month(Request $request): View { $year = $request->year; $month = $request->month; $posts = $this->Post->findByCreated($year, $month); return view( 'posts.month', [ 'year' => $year, 'month' => $month, 'posts' => $posts, ] ); } Post.php public function findByCreated(string $year, string $month): LengthAwarePaginator { $posts = Post::where('is_published', 1) ->whereYear('created_at', $year) ->whereMonth('created_at', $month) ->latest()->paginate(9); $posts->load('user', 'tags', 'images'); return $posts; } 完成です! view 側は、 <div id="blog-top"> {{$year}}年 {{$month}}月 の記事一覧</div> みたいな感じにすると年月に対応した表示になるのでわかりやすいと思います! 月別記事一覧は、投稿数が多いブログだと必要になってくると思うのでぜひ参考にしてみてください〜!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

laravelでyoutubeの料理動画を管理するアプリを作ってみた。

laravelを使ってYoutube上にある料理動画を管理するサービスを作成しました。 Youtubeには様々な料理動画が日々アップされていますが、実際に作ってみてよかったものをストックしたり、 少し自分好みにアレンジした時のメモを残したいと思ったので、当サービスを作ってみました。 セキュリティ面など至らない点が多いとは思いますが、興味があれば使ってみていただけると幸いです。 ⇩作成したサービス 自己紹介 PHPを本格的に学習し始めて3ヶ月目の駆け出しエンジニア。前職はインフラ系で現在Webエンジニアになるため転職活動中です。 使用技術 フロントエンド Javascript Jquery Bootstrap バックエンド PHP(Laravel8) YoutubeAPI Mysql インフラ AWS Git 認証機能はLaravelにデフォルトで備わっているlaravel-authを使用しました。 また、AWSはEC2でサーバーをたて、データベースにRDS、ドメインの割り当てにRoute53(ドメインはお名前ドットコムで取得)、メールの送信にAmazonSESを使用しています。 作成期間 2022年2月下旬~2022年3月下旬の約一ヶ月間。 使い方 会員登録画面 ログイン画面 Home画面 ライブラリ 「レシピ本を見る」⇒ 自分のレシピ本を作成する。フォルダ分けしてレシピを保存するイメージ。 「保存したレシピ」⇒ 自分が保存したレシピをすべて表示する。検索可能。ここからもレシピを追加できる。 レシピを探す 「みんなのレシピ」⇒ 他のユーザーが作成したレシピを探す。 「動画から探す」⇒ 他のユーザーが追加したレシピをYoutubeの動画単位で探す。平均評価順など並び替え可能。動画をクリックすると、動画再生ページに遷移し、レシピの追加が可能になる。 Library画面 作成したレシピ本一覧。「+ Create New Recipeboook」でレシピ本を新規作成できる。 Book画面 作成したレシピ本の内容を表示する。右下の「+」ボタンを押すと、、、 レシピ作成用のモーダルが表示される。ここに追加したいYoutube動画のURLを入力し、「動画のタイトルとサムネイルを取得」をクリックすると、、、 Youtubeからタイトルとサムネイルが取得でき、「追加」ボタンをクリックしてレシピを追加できる。 レシピの追加方法は以上。その他のページも基本的にはこれと似たような使い方になる。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

月別記事一覧と、投稿数表示機能

目次 1.月別集計 2.月別ページ表示 Laravelを使ったブログサイト作成で、月別記事一覧と投稿数を表示させる機能を作ったのでアウトプット記事書いてみます。 ↓ 最終目標はこんな感じです 1. 月別集計 流れとしては、公開中の記事から指定した年の記事を取得し、月別取得&投稿数取得。 あとは blade側で @foreach を使って月と投稿数を表示させていく感じです! where('is_published', 1) を書かないと非公開記事まで表示されてしまうので注意です! PostController.php public function index(): View { ...省略 $year = date('Y'); $monthPosts = $this->Post->findMonthPostCount($year); return view( 'posts.index', [ 'year' => $year, 'monthPosts' => $monthPosts, ] ); } Post.php public function findMonthPostCount($year): Collection { return Post::where('is_published', 1) ->whereYear('created_at', $year) ->orderBy('created_at') ->get() ->groupBy(function ($row) { return $row->created_at->format('m'); //月別取得 }) ->map(function ($day) { return $day->count(); //投稿数取得 }); } index.blade.php ...省略 <h1 class="month-title">月別記事</h1> <button class="button">{{$year}}</button> <div class="card-month"> @foreach($monthPosts as $month => $count) <li class="li-month"> <a href="{{ route('posts.month', [$year, $month]) }}"> {{$year}}/{{ $month }} ({{$count}}) </a> </li> @endforeach これを表示させてみると、こんな感じです! 投稿がある月だけ表示されるのでとても見やすいと思います! 例えば、追加で5月の記事を投稿してみた場合、 こんな感じで5月の記事が追加されます! そのまま URL になっているのでクリックで月別記事一覧に飛べます! <a href="{{ route('posts.month', [$year, $month]) }}"> {{$year}}/{{ $month }} ({{$count}}) </a> 2. 月別ページ表示 月別ページの表示は、 $year $month を引数で渡してあげて指定した月を取得すればOKです! PostController.php public function month(Request $request): View { $year = $request->year; $month = $request->month; $posts = $this->Post->findByCreated($year, $month); return view( 'posts.month', [ 'year' => $year, 'month' => $month, 'posts' => $posts, ] ); } Post.php public function findByCreated(string $year, string $month): LengthAwarePaginator { $posts = Post::where('is_published', 1) ->whereYear('created_at', $year) ->whereMonth('created_at', $month) ->latest()->paginate(9); $posts->load('user', 'tags', 'images'); return $posts; } 完成です! view 側は、 <div id="blog-top"> {{$year}}年 {{$month}}月 の記事一覧</div> みたいな感じにすると年月に対応した表示になるのでわかりやすいと思います! 月別記事一覧は、投稿数が多いブログだと必要になってくると思うのでぜひ参考にしてみてください〜!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Composerをインストールする意味

今回の記事について 未経験の枠で就職活動をしていたけど、その中で技術的な質問がいくつかあった。 答えられないことも多かったので積極的なアウトプットをしていこうと思った。 今回の記事に関してはComposerのインストール方法ではなく、インストールする必要性について記載する ※Composerで検索してこの記事にたどり着いた人もいるかもしれないのでインストール方法についての参照記事も添付する Composerとは ComposerとはPHPのパッケージ依存管理ツールのことです。 つまり!!インストールすると一発で必要なパッケージがインストールされるのです!! 例えばlaravel/uiをインストールしたいときも次のような以下のようなコマンドになります composer request laravel/ui インストールについては、Composerはコマンドで操作ができます。インストールやバージョンの確認など全てコマンドプロンプトやターミナル上で行います。 ComposerのダウンロードはWindowsでもMaxでも可能です。 リンクです!! https://getcomposer.org/ Composerを使うメリット 実は今回のメインであるComposerのインストールする意味に関してはほとんど話してしまったので簡潔にまとめると ・PHPの開発において必要なツールをインストールしてくれる ・WindowsやMac、LinuxなどOS関係なくインストールできる ・コマンドの操作は必要なのでコマンドもいくつか勉強できる
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

既存のカラムに onDelete cascade を追加した際のメモ【Laravel】

環境:Laravel 6.2 検索した感じでは8でも変わってないはず、、 状況 ユーザーの退会処理を作ろうと思い、$user->delete();を行ったところ下記のエラーが出た Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails ユーザーが投稿した記事(articlesテーブル)が外部キーでユーザーと紐づいているため、 先に該当ユーザーが投稿した記事を削除しないとエラーが出てしまうようだ 対応案 ユーザーの退会処理を行うメソッド内で、先に記事削除の処理を書けば一応解決はする。 しかし、articlesテーブルの外部キーにonDelete cascadeを設定してやれば、そのあたり自動でやってくれるので、今回はそちらを行うことにした。 onDelete cascade追加用のマイグレーションファイル作成 articlesテーブルの中身がすべて消えても良いなら ロールバック後にarticlesテーブル作成用のマイグレーションファイルを書き直せば良いが 今回は消したくなかったので、onDelete cascade追加用のマイグレーションファイルを新たに作成した。 onDelete cascade追加用のマイグレーションファイル <?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; class AddCascadeToUserIdOnArticleTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::table('articles', function (Blueprint $table) { $table->dropForeign(['user_id']);//いったん外部キーを削除する。 $table->foreign('user_id') ->references('id')->on('users') ->onDelete('cascade'); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::table('articles', function (Blueprint $table) { $table->dropForeign(['user_id']); $table->foreign('user_id') ->references('id')->on('users'); }); } } 注意点としては、上記コードupメソッド内のコメントにも書いているが 先に外部キーを削除する必要があるので、upメソッド内に$table->dropForeign(['user_id']);を記述していること。 ちなみにこのdropForeignの引数は、本来であれば「リレーション元のテーブル名_外部キーを設定しているカラム名_foreign」なので、dropForeign(articles_user_id_foreign)となるが、今回のようにリレーション先のテーブル名(users)に対して、外部キーを設定しているカラム名がuser_id(usersの単数形+_id)といった形で、Laravelの命名ルールに則っている場合は、上記コードのようにdropForeign(['user_id'])という書き方もできる。 確認 もちろん$user->delete();を行えば動作確認はできるし、 phpmyadminでの確認やコマンドでDBにログインしての確認もできる。 ちなみに onDelete cascade は「連動して削除する」だが onDelete restrict は「連動せず、削除を制限する(エラーが出る)」。restrictがデフォルト。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

既存のカラムに onDelete cascade を追加【Laravel】

環境:Laravel 6.2 検索した感じでは8でも変わってないはず、、 状況 ユーザーの退会処理を作ろうと思い、$user->delete();を行ったところ下記のエラーが出た Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails ユーザーが投稿した記事(articlesテーブル)が外部キーでユーザーと紐づいているため、 先に該当ユーザーが投稿した記事を削除しないとエラーが出てしまうようだ 対応案 ユーザーの退会処理を行うメソッド内で、先に記事削除の処理を書けば一応解決はする。 しかし、articlesテーブルの外部キーにonDelete cascadeを設定してやれば、そのあたり自動でやってくれるので、今回はそちらを行うことにした。 onDelete cascade追加用のマイグレーションファイル作成 articlesテーブルの中身がすべて消えても良いなら ロールバック後にarticlesテーブル作成用のマイグレーションファイルを書き直せば良いが 今回は消したくなかったので、onDelete cascade追加用のマイグレーションファイルを新たに作成した。 onDelete cascade追加用のマイグレーションファイル <?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; class AddCascadeToUserIdOnArticleTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::table('articles', function (Blueprint $table) { $table->dropForeign(['user_id']);//いったん外部キーを削除する。 $table->foreign('user_id') ->references('id')->on('users') ->onDelete('cascade'); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::table('articles', function (Blueprint $table) { $table->dropForeign(['user_id']); $table->foreign('user_id') ->references('id')->on('users'); }); } } 注意点としては、上記コードupメソッド内のコメントにも書いているが 先に外部キーを削除する必要があるので、upメソッド内に$table->dropForeign(['user_id']);を記述していること。 ちなみにこのdropForeignの引数は、本来であれば「リレーション元のテーブル名_外部キーを設定しているカラム名_foreign」なので、dropForeign(articles_user_id_foreign)となるが、今回のようにリレーション先のテーブル名(users)に対して、外部キーを設定しているカラム名がuser_id(usersの単数形+_id)といった形で、Laravelの命名ルールに則っている場合は、上記コードのようにdropForeign(['user_id'])という書き方もできる。 確認 もちろん$user->delete();を行えば動作確認はできるし、 phpmyadminでの確認やコマンドでDBにログインしての確認もできる。 ちなみに onDelete cascade は「連動して削除する」だが onDelete restrict は「連動せず、削除を制限する(エラーが出る)」。restrictがデフォルト。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【インフラ構築】MENTAにてフォローしていただいた事を振り返ります

背景 Laravelで作成したポートフォリオのAWSデプロイに苦労していた時、MENTAにて@adachin0817さんよりお声がけいただき、インフラ構築のフォローをしていただきました。 以下のプランよりフォローしていただきました。 構築過程 まず最初に開発環境構築に使用すたDockerの設定があまりよろしくなかったので、 開発環境の再構築から始めました。 (本番環境と設定を合わせる目的もあります) 開発環境 開発環境にはDockerを使用しています Docker 20.10.12 Docker Compose v2.2.3 Docker image laravel-app(appコンテナ) php7.4-fpm-alpine(nginx,php-fpm,supervisor) Laravel 6.20.34 laravel-db(mysqlコンテナ) MySQL 8.0.27 以下構成図です。 具体的な構成、構築内容は以下の記事にまとめました。 【Docker+Laravel6】開発環境構築についてまとめてみました 本番環境 本番環境はAWSを使用し、CircleCIで自動デプロイを可能にしています AWS:EC2, RDS, VPC, Route 53, ALB, ACM, S3, CloudWatch EC2 : nginx, php-fpm RDS : mysql 8.0.27 CircleCI deploy job : git pullデプロイ自動化 slack orb : Slackデプロイ結果通知   以下構成図です。 具体的な構成、構築内容は以下の記事にまとめました。 【AWS+Laravel】本番環境構築についてまとめてみました 身についたこと Docker, AWSのインフラの構造とCircleCIの設定・操作の理解 構成を理解し構成図として表記できる能力 公式ドキュメントを軸に、あらゆる記事を読み、最適な実装方法を導き出せる能力 自走力 実装中に意識したこと 後で見返してもわかりやすいように、タグや説明をその都度付け加える。 各サービス同士の繋がりを意識しながら構築していく。 とにかく諦めないこと。 振り返り ちょうど1ヶ月でのデプロイ完了でした。技術力のみならず質問力も鍛えられました。 まだまだ理解不足なところもあるので、普段の学習と実務経験で、もっと対応できる幅を広げていきたいです。 最後に @adachin0817さんのMENTAプランについて紹介します。 初学者が一番悩むであろう構築までのロードマップを速攻で作っていただき、構築完成まで手厚いサポートをしていただきました。 とにかく質問への回答が早く、問題を素早く解決できます。 また、実務レベルのフォローで、メンティー自身が解決までたどり着けるよう導いてくださるので、自走力爆上がりすると思います! 初学者にとっては決して甘くはないですが、インフラの知識のみならずエンジニアとしての心得を学ぶにおいて、@adachin0817さんのサポートは最高です。 おすすめです!!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【AWS+Laravel】本番環境構築についてまとめてみました

背景 Laravelを使用して開発したポートフォリオのデプロイをする目的で、AWSで本番環境を構築しました。 AWSを使用した理由は、インフラの構造をしっかりと理解したかったからと、 実務に入るとプログラミングだけではなく、サーバーやネットワークについての知識も必要だろうと考えたからです。 開発環境構築(Docker+Laravel6)については以下にまとめました 【Docker+Laravel6メモ】開発環境構築についてまとめてみました 本番環境について AWS:EC2, RDS, VPC, Route 53, ALB, ACM, S3, CloudWatch EC2 : nginx, php-fpm RDS : mysql 8.0.27 CircleCI deploy job : git pullデプロイ自動化 slack orb : Slackデプロイ結果通知 本番環境構成図 構築ロードマップ 順番 手順 1 お名前.comで独自ドメイン取得する 2 お名前.comで取得したドメインをRoute53に登録する 3 VPCを作成する 4 セキュリティーグループを作成する 5 EC2インスタンスを作成する 6 ACMでSSL証明書を発行する 7 ELBを作成する 8 Route53でAレコードのエイリアスを作成する 9 RDSを作成する 10 EC2インスタンスにLaravel環境を構築してアプリのデプロイをする 11 CircleCIを使用した自動デプロイ(執筆中) 12 AWS S3を使用した画像アップロード(執筆中) 構築手順(記事) 1.お名前.comで独自ドメイン取得する 2.お名前.comで取得したドメインをRoute53に登録する 3.VPCを作成する 4.セキュリティーグループを作成する 5.EC2インスタンスを作成する 6.ACMでSSL証明書を発行する 7.ELBを作成する 8.Route53でAレコードのエイリアスを作成する 9.RDSを作成する 10.EC2インスタンスにLaravel環境を構築してアプリのデプロイをする 11.CircleCIを使用した自動デプロイ(執筆中) .... 12.AWS S3を使用した画像アップロード(執筆中) .... 振り返り 今回のAWSの環境構築を通して、Webサービスがどのように運用されているのかを知るキッカケになりました。 インフラ周りの知識を理解するのに、AWSは最適だ思います!! 自分が構築した環境は、コストを考えたシンプルな構造となっているため、おそらく基本の域だと思います。 実務でも通用する技術を身につけるためには、更に深く学んでいく必要があります。 なので、これからもAWSを通じてインフラ周りの知識を磨いていこうと思います!! 難しいけど、がんばります(笑)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【AWS+Laravel+CircleCI】本番環境構築についてまとめてみました

背景 Laravelを使用して開発したポートフォリオのデプロイをする目的で、AWSで本番環境を構築しました。 AWSを使用した理由は、インフラの構造をしっかりと理解したかったからと、 実務に入るとプログラミングだけではなく、サーバーやネットワークについての知識も必要だろうと考えたからです。 (CircleCIについての記事は執筆中です。) 開発環境構築(Docker+Laravel6)については以下にまとめました 【Docker+Laravel6メモ】開発環境構築についてまとめてみました 本番環境について AWS:EC2, RDS, VPC, Route 53, ALB, ACM, S3, CloudWatch EC2 : nginx, php-fpm RDS : mysql 8.0.27 CircleCI deploy job : git pullデプロイ自動化 slack orb : Slackデプロイ結果通知 本番環境構成図 構築ロードマップ 順番 手順 1 お名前.comで独自ドメイン取得する 2 お名前.comで取得したドメインをRoute53に登録する 3 VPCを作成する 4 セキュリティーグループを作成する 5 EC2インスタンスを作成する 6 ACMでSSL証明書を発行する 7 ELBを作成する 8 Route53でAレコードのエイリアスを作成する 9 RDSを作成する 10 EC2インスタンスにLaravel環境を構築してアプリのデプロイをする 11 CircleCIを使用した自動デプロイ(執筆中) 12 AWS S3を使用した画像アップロード(執筆中) 構築手順(記事) 1.お名前.comで独自ドメイン取得する 2.お名前.comで取得したドメインをRoute53に登録する 3.VPCを作成する 4.セキュリティーグループを作成する 5.EC2インスタンスを作成する 6.ACMでSSL証明書を発行する 7.ELBを作成する 8.Route53でAレコードのエイリアスを作成する 9.RDSを作成する 10.EC2インスタンスにLaravel環境を構築してアプリのデプロイをする 11.CircleCIを使用した自動デプロイ(執筆中) .... 12.AWS S3を使用した画像アップロード(執筆中) .... 振り返り 今回のAWSの環境構築を通して、Webサービスがどのように運用されているのかを知るキッカケになりました。 インフラ周りの知識を理解するのに、AWSは最適だ思います!! 自分が構築した環境は、コストを考えたシンプルな構造となっているため、おそらく基本の域だと思います。 実務でも通用する技術を身につけるためには、更に深く学んでいく必要があります。 なので、これからもAWSを通じてインフラ周りの知識を磨いていこうと思います!! 難しいけど、がんばります(笑)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel APIリソースコレクションで単一のリソースで構成されたレスポンスを作る

APIリソース、リソースコレクションとは APIを構築する際の、モデルと実際のJSONレスポンスの間の変換レイヤー。 ユーザー情報をJSONでレスポンスするときに、特定の属性を表示したかったり、他のユーザーには表示したくないなどある。 詳細はreadoubleを確認 https://readouble.com/laravel/8.x/ja/eloquent-resources.html なにがしたいか ドキュメントの例で下記のようなのがある。 use App\Http\Resources\UserResource; use App\Models\User; Route::get('/users', function () { return UserResource::collection(User::all()); }); class UserCollection extends ResourceCollection { /** * リソースコレクションを配列に変換 * * @param \Illuminate\Http\Request $request * @return array */ public function toArray($request) { return [ 'data' => $this->collection, 'links' => [ 'self' => 'link-value', ], ]; } } 実際に一覧のレスポンスなどで似たようなことをする時があり このときdataにはいるものを別で作ったUserResourceにしたい。 class UserResource extends JsonResource { public function toArray($request) { return [ 'id' => $this->uuid, 'name' => $this->name, 'random_num' => rand(),// なにかしらの追加とか ]; } } やりかた ループして毎度 new UserResourceでもいけるが、同様のことをできるメソッドがあった class UserCollection extends ResourceCollection { /** * リソースコレクションを配列に変換 * * @param \Illuminate\Http\Request $request * @return array */ public function toArray($request) { return [ 'data' => $this->collection->mapInto(UserResource::class), 'links' => [ 'self' => 'link-value', ], ]; } } スッキリした
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む