- 投稿日:2020-07-20T22:33:34+09:00
Laravel のHash::make をbcrypt の場合でCLI で再現したい場合
- 投稿日:2020-07-20T20:38:55+09:00
【Laravel】データベース
書籍のアウトプットとして
データベースの準備
Laravelのアプローチ
DBクラス(クエリビルダ)
一番シンプルなDBクラスを使用する
直接SQLを直接実行するようなもの。クエリビルダ機能がついている。
用語 説明 DBクラス DB利用のための基本的な機能を備えている。 クエリビルダ メソッドを使ってDBにアクセスできるようになり、SQLではなく、PHPらしい処理ができるようになる Eloquent(ORM)
EloquentというORMを使用することで、DBクラスよりも遥かにPHPらしい処理をできる。
用語 説明 ORM DBのデータとプログラミング言語のオブジェクトの間を取り持つ SQLiteデータベースを用意する
Laravelはどのデータベースを使っても同じ扱いができるため、どのデータベースを使おうと基本的に違いはない。
ここではSQLiteを利用していくSQLiteの特徴
SQLiteはデータベースサーバの起動が必要なく手軽に利用できる。
PHPにはSQLiteファイルにアクセスするための機能があるため,SQLite本体すら不要。テーブルを利用する
Laravelカレントディレクトリへ移動してdatabaseディレクトリへ移動して下記コマンド
$ sqlite3 database.sqlite下記コマンドでDBを作成
CREATE TABLE `people` ( `id` INTEGER PRIMARY KEY AUTOINCREMENT, `name` TEXT NOT NULL, `mail` TEXT, `age` INTEGER );ダミーレコードを追加
INSERT INTO `people` VALUES (1,'taro','taro@yamada.jp',35); INSERT INTO `people` VALUES (2,'hanako','hanako@flower.com',24); INSERT INTO `people` VALUES (3,'sachiko','sachi@happy.org',47);DB利用のための手続き
php:config/database.php'default' => env('DB_CONNECTION', 'mysql'),これを以下に修正
php:config/database.php'default' => env('DB_CONNECTION', 'sqlite'),これでLaravelで利用するDBがSQLiteになった
- 投稿日:2020-07-20T14:40:11+09:00
Elastic Beanstalkでデプロイする際に、No such file or directory: '/var/app/ondeck/' と表示される
はじめに
Elastic Beanstalkに構築したLaravelアプリケーションのデプロイの際に「No such file or directory: '/var/app/ondeck/'」と表示され、デプロイに失敗しました
環境
$ php artisan -V Laravel Framework 6.18.25Elastic Beanstalkプラットフォームバージョン : PHP 7.3 running on 64bit Amazon Linux2
エラー内容
$ eb logs ---------------------------------------- /var/log/eb-engine.log ---------------------------------------- ・ ・ ・ 2020/07/20 14:17:25.467640 [ERROR] Error occurred during build: [Errno 2] No such file or directory: '/var/app/ondeck/storage' 2020/07/20 14:17:25.467671 [ERROR] An error occurred during execution of command [app-deploy] - [PostBuildEbExtension]. Stop running the command. Error: Container commands build failed. Please refer to /var/log/cfn-init.log for more details.対応方法
プラットフォームのバージョンを「PHP 7.3 running on 64bit Amazon Linux2」から「PHP 7.3 running on 64bit Amazon Linux」に変更して、対処しました
(Amazon Linux2系を使用するのをやめました)まとめ
Amazon Linux2では、「/var/app/ondeck」のフォルダがなくなったようです
抜本的な解決になっていませんが、お困りの方は参考にしてみてください参考
AWS Developer Forums: Server stuck in a loop (eb-engine.log)
- 投稿日:2020-07-20T14:39:59+09:00
【Laravel7】ユーザーをキーワード検索する
はじめに
Laravel7の認証機能で登録したユーザーについて、キーワード検索できるページを作成します。
環境
XAMPP環境でLaravelが使えるように設定してあります。
- Windows10 Pro 64bit
- PHP 7.3.18
- Laravel 7.12.0
- MariaDB 10.1.32
※認証機能でユーザーを登録したり、管理者を追加したりの一連の流れは過去記事をご覧ください。
- 【Laravel7でユーザー認証_1】基本のき
- 【Laravel7でユーザー認証_2】ユーザー認証を日本語化
- 【Laravel7でユーザー認証_3】ユーザー認証をメールアドレスからユーザー名に変更する
- 【Laravel7でユーザー認証_4】パスワード変更フォームを作成する
- 【Laravel7でユーザー認証_5】ユーザーを倫理削除(SoftDelete)する
- 【Laravel7でユーザー認証_6】ユーザーの情報を表示・変更する設定画面を作成する
- 【Laravel7でユーザー認証_7】会員登録時にメール認証を行う
- 【Laravel7でユーザー認証_8】メールアドレス変更時にメール認証を行う
- 【Laravel7でユーザー認証_9】マルチ認証機能を使って管理者を作成する
- 【Laravel7でユーザー認証_10】マルチ認証機能で作成した管理者のパスワード変更・リセット機能を追加する要件
- 管理者のhomeに検索フォームを設置する。
- デフォルトの状態(アクセス直後)は全てのユーザーを表示する。
- 検索フォームに何も入っていないで検索した場合、全てのユーザーを表示する。
- キーワードは名前またはメールアドレスの部分一致で検索する。
- キーワードを半角または全角のスペースで区切った場合、AND検索とする。
- 検索結果は10件毎にページネーションする。
実装
コントローラ
app/Http/Controllers/Admin/HomeController.php<?php namespace App\Http\Controllers\Admin; use App\Http\Controllers\Controller; use App\User; use Illuminate\Http\Request; class HomeController extends Controller { /** * Create a new controller instance. * * @return void */ public function __construct() { $this->middleware('auth:admin'); } public function redirectIndex() { return redirect(route('admin.home')); } public function index(Request $request) { $q = $request->input('q'); //フォームの入力値を取得 //検索キーワードが空の場合 if (empty($q)) { $users = User::paginate(10); //全ユーザーを10件/ページで表示 //検索キーワードが入っている場合 } else { $_q = str_replace(' ', ' ', $q); //全角スペースを半角に変換 $_q = preg_replace('/\s(?=\s)/', '', $_q); //連続する半角スペースは削除 $_q = trim($_q); //文字列の先頭と末尾にあるホワイトスペースを削除 $_q = str_replace(['\\', '%', '_'], ['\\\\', '\%', '\_'], $_q); //円マーク、パーセント、アンダーバーはエスケープ処理 $keywords = array_unique(explode(' ', $_q)); //キーワードを半角スペースで配列に変換し、重複する値を削除 $query = User::query(); foreach($keywords as $keyword) { //1つのキーワードに対し、名前かメールアドレスのいずれかが一致しているユーザを抽出 //キーワードが複数ある場合はAND検索 $query->where(function($_query) use($keyword){ $_query->where('name', 'LIKE', '%'.$keyword.'%') ->orwhere('email', 'LIKE', '%'.$keyword.'%'); }); } $users = $query->paginate(10); //検索結果のユーザーを10件/ページで表示 } return view('admin.home', compact('users', 'q')); } }検索文字列に「yamada taro」と入力した場合、名前かメールアドレスに「yamada」という文字列が含まれているユーザーを抽出し、さらにその中で、名前かメールアドレスに「taro」という文字列が含まれているユーザーを抽出するという仕様になります。
この、(A or B) and (C or D) の条件での検索は、useを使ってクロージャへ変数を渡してやることで実現します。(参考:Eloquent/QueryBuilderによるAnd検索とOr検索の複合)view
resources/views/admin/home.blade.php@extends('layouts.admin.app') @section('content') <div class="container"> <div class="row justify-content-center"> <div class="col-md-8"> <form method="GET" action="{{ route('admin.home') }}"> <div class="form-row"> <div class="col"> <input id="q" type="text" class="form-control" name="q" value="{{ $q }}" autocomplete="q" autofocus placeholder="{{ __('Name or Email') }}"> </div> <div class="col-auto"> <button type="submit" class="btn btn-primary"> {{ __('Search') }} </button> </div> </div> </form> </div> <div class="col-md-12"> @if (session('status')) <div class="alert alert-success" role="alert"> {{ session('status') }} </div> @endif @if(!empty($users)) {{ __('SearchResult') }} : {{ __('SearchCount', ['num' => $users->total()]) }} <div class="card" style="margin-bottom: 20px;"> <div class="card-header">{{ __('UserList') }}</div> <div class="card-body"> <table class="table table-hover"> <thead> <tr> <th>{{ __('ID') }}</th> <th>{{ __('Name') }}</th> <th>{{ __('E-Mail Address') }}</th> <th>{{ __('CreateDate') }}</th> <th>{{ __('UpdateDate') }}</th> </tr> </thead> <tbody> @foreach($users as $user) <tr> <td>{{ $user->id }}</td> <td>{{ $user->name }}</td> <td>{{ $user->email }}</td> <td>{{ $user->created_at->format('Y/m/d') }}</td> <td>{{ $user->updated_at->format('Y/m/d') }}</td> </tr> @endforeach </tbody> </table> </div> </div> <div class="paginate"> {{ $users->appends(Request::only('q'))->links() }} </div> @endif </div> </div> </div> @endsection
$users
に渡された値を、foreach
で展開します。
$users->total()
で結果の合計件数が表示できます。
ページネーションで2ページ目以降のページにもキーワードを引き継ぎさせたいので、 ページネーション部分はappends
メソッドでクエリ文字列(q)を指定し$users->appends(Request::only('q'))->links()
とします。参考サイト
- 投稿日:2020-07-20T12:28:54+09:00
Laravel CRUD処理を使った投稿アプリを作成する その5 投稿削除機能
目的
- アプリを作成する上で基本となるCRUD処理を有したLaravelアプリをチュートリアル的に作成する方法をまとめる
実施環境
- ハードウェア環境
項目 情報 OS macOS Catalina(10.15.5) ハードウェア MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports) プロセッサ 2 GHz クアッドコアIntel Core i5 メモリ 32 GB 3733 MHz LPDDR4 グラフィックス Intel Iris Plus Graphics 1536 MB
- ソフトウェア環境
項目 情報 備考 PHP バージョン 7.4.3 Homwbrewを用いて導入 Laravel バージョン 7.0.8 commposerを用いてこちらの方法で導入→Mac Laravelの環境構築を行う MySQLバージョン 8.0.19 for osx10.13 on x86_64 Homwbrewを用いてこちらの方法で導入→Mac HomebrewでMySQLをインストールする 前提条件
- 実施環境に近い環境が構築されていること。
- 筆者は下記の方法で環境構築を行った。
前提情報
- DockerやAWSなどは使用せずにMacのローカルに実施環境と同じLaravel開発環境を構築して実施する。
- チュートリアルで実際に筆者が作成したソースコードをGitHubにて公開予定である。
- CRUD処理の作成完了を最短目標にしてバリデーションなどは後々設定することとする。
- 実施環境と同じ環境がDockerやAWSで用意できるなら都度読み替えていただければ実施が可能だと思う。
- 公式ドキュメントと一冊の技術書を元に本記事を記載する。
- Laravel 7.x
- PHPフレームワーク Laravel Webアプリケーション開発 バージョン5.5 LTS対応
- 本記事はシリーズとして内容を分割する予定である。記事のタグ「miriwo_laravelチュートリアル」を本シリーズの記事に付与するのでそのほかの記事がみたい方は活用していただきたい。
この記事の読後感
- 投稿内容の削除機能が実装できる。
全ての記事(miriwo_laravelチュートリアル)を通した読後感
- Laravelアプリでログインなどのユーザ認証付き投稿アプリの作成ができる。
概要
- ルーティングの記載
- コントローラの記載
- ビューファイルの修正
- 確認
詳細
ルーティングの記載
laravel_crudディレクトリで下記コマンドを実行してルーティングファイルを開く。
$ vi routes/web.php開いたファイルに下記の行を追記する。
laravel_crud/routes/web.phpRoute::post('/delete', 'ContentController@delete')->name('delete');コントローラの記載
laravel_crudディレクトリで下記コマンドを実行して作成したコントローラファイルを開く。
$ vi app/Http/Controllers/ContentController.php下記の内容をクラス内に追記する。
laravel_crud/app/Http/Controllers/ContentController.phppublic function delete(Request $request) { $contents_delete_query = Content::select('*'); $contents_delete_query->where('id', $request['content_id']); $contents_delete_query->delete(); return redirect('/output'); }記載後のコントローラファイルの内容を下記に記載する。
laravel_crud/app/Http/Controllers/ContentController.php<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Models\Content; class ContentController extends Controller { public function input() { return view('contents.input'); } public function save(Request $request) { $input_content = new Content(); $input_content->content = $request['content']; $input_content->save(); return redirect('/output'); } public function output() { $contents_get_query = Content::select('*'); $all_contents = $contents_get_query->get(); return view('contents.output', [ 'all_contents' => $all_contents, ]); } public function delete(Request $request) { $contents_delete_query = Content::select('*'); $contents_delete_query->where('id', $request['content_id']); $contents_delete_query->delete(); return redirect('/output'); } }ビューファイルの修正
laravel_crudディレクトリで下記コマンドを実行してビューファイルを開く。
vi resources/views/contents/output.blade.php
開いたビューファイルに下記の内容を追記する。
laravel_crud/resources/views/contents/output.blade.php<h1>output</h1> @foreach ($all_contents as $item) <hr> <p>{{$item['content']}}</p> <!-- 下記を追記 --> <form action="{{route('delete')}}" method="post"> @csrf <input type="hidden" name="content_id" value="{{$item['id']}}"> <input type="submit" value="削除"> </form> @endforeach確認
laravel_crudディレクトリで下記コマンドを実行してローカルサーバを起動する。
$ php artisan serveブラウザで下記にアクセスする。
「削除」ボタンをクリックして投稿内容が削除されることを確認する。
下記の様に投稿内容が削除されれば本記事の内容は完了である。