- 1. 【実践】Laravel+MySQLの全文検索機能実践
- 2. docker-laravel の Docker 構成をちゃんと理解する【Dockerfile 編 – Nginx】
- 3. PHP 8.1 Enums を使ってみる
- 4. 『SQLアンチパターン』まとめその4(19〜25章)
- 5. Laravelのnullチェック使い分け(随時更新)
- 6. PHPのnullチェック使い分け
- 7. 【PHP】if文で「isset()」を使うより「??」を使うべき理由がコレ
- 8. VSCodeのPHP IntelephenseでPHP8.1の記法記載時にエラーがでる
- 9. macOS Monterey(12.0.1)にapacheとphpを設定する
- 10. 【PHP】filter_inputを使用したサニタイズ
- 11. [PMMP] Enum(列挙型)を使おう!
- 12. 【Laravel8.4】composer create-project laravelでエラーが出たときの解決方法
- 13. 『SQLアンチパターン』まとめその3(13〜18章)
- 14. Laravel ってなに?
- 15. 「MySQLでデータベース作成」と「PHPでデータベース記録」。(8日目)
- 16. LaravelのcommandでUser以外のDBデータをEloquentで取り出せない件
- 17. JSON データを POST で受けるテストサーバを作る
- 18. Laravelで直接SQL文を実行する
- 19. [PMMP]パーミッションを使う
- 20. Laravel7以下向けパッケージ開発でSeederにFactoryを使う
【実践】Laravel+MySQLの全文検索機能実践
# はじめに
`LIKE`検索は全ての行に対して条件に合致するかを判定するのでデータが増えるにつれ検索速度が遅くなる場合があるようです。
この記事では、MySQLの全文検索機能を導入した方法についてハンズオン形式で紹介させていただきます。
https://dev.mysql.com/doc/refman/8.0/ja/fulltext-search-ngram.html
完成系のリポジトリ
@ucan-labさんの記事を参考にLAMP環境を構築いたしました?♂️https://qiita.com/ucan-lab/items/56c9dc3cf2e6762672f4
https://github.com/nao-haba-dev/ngram-docker-laravel
# 事前準備
– GitHub・Dockerが利用できる準備をお願いしますhttps://github.com
https://qiita.com/ucan-lab/items/aadbedcacbc2ac86a2b3
– MAC
https://docs.docker.com/deskt
docker-laravel の Docker 構成をちゃんと理解する【Dockerfile 編 – Nginx】
@ucan-lab さんの [docker-laravel](https://github.com/ucan-lab/docker-laravel) の環境をちゃんと理解するための記事
今回は Dockerfile の Nginx 編です。
[docker-compose 編](https://qiita.com/tkek321/items/9c0c5cec1dc349c67f5f)
[Dockerfile 編 – PHP](https://qiita.com/tkek321/items/5d7714d7170bbf379c11)# Dockerfile
https://github.com/ucan-lab/docker-laravel/blob/main/infra/docker/nginx/Dockerfile
“`dockerfile:dockerfile
# — ① ビルドイメージの指定 —
FROM node:16-alpine as node
FROM nginx:1.20-alpine
# ——
# ② メタデータを追加
LABEL ma
PHP 8.1 Enums を使ってみる
## 列挙型(Enumerations)
PHP8.1で実装されたEnumの使い方を軽くご紹介します。
## 環境
“`shell-session
$ php -v
PHP 8.1.1 (cli) (built: Dec 17 2021 23:49:52) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.1.1, Copyright (c) Zend Technologies
with Zend OPcache v8.1.1, Copyright (c), by Zend Technologies
“`## 使い方
“`php
『SQLアンチパターン』まとめその4(19〜25章)
[SQLアンチパターン](https://www.oreilly.co.jp/books/9784873115894/) をまとめました。
この本では、1. [データベース論理設計のアンチパターン(1〜8章)](https://qiita.com/Natsumag/items/c9c91f6fa7a3af6dd1d1 “『SQLアンチパターン』まとめその1”)
1. [データベース物理設計のアンチパターン(9〜12章)](https://qiita.com/Natsumag/items/9eb3c32a3193c74abbe6 “『SQLアンチパターン』まとめその2”)
1. [クエリのアンチパターン(13〜18章)](https://qiita.com/Natsumag/items/aca26493cd071a573c4a “『SQLアンチパターン』まとめその3”)
1. アプリケーション開発のアンチパターン(19〜25章)の4つのパートに分けてそれぞれのアンチパターンを解説しており、
この記事では「__4. アプリケーション開発のアンチパターン__」について記述します。
Laravelのnullチェック使い分け(随時更新)
## Request
以下がある。– isset()
– is_null()
– empty()※PHPのネイティブメソッド
各メソッドの違いは[こちら](https://qiita.com/xQIEBo4zFWKZ0ig/items/a69ec15aa1697b13d666)### ちなみに : Requestのnull挙動
– そもそも対象のnameが存在しない時
nullになる– nameは存在するが、valueが空の時
これもnullになる## Collection
以下がある。– isEmpty()
– isNotEmpty()※Laravelのコレクションメソッド
## 参考文献
https://readouble.com/laravel/6.x/ja/collections.html
PHPのnullチェック使い分け
## nullのみチェック
### isset
– nullの時だけfalse
– 空文字、空配列はtrueになる### is_null
– nullの時だけtrue
– 空文字、空配列の時はfalse## 全チェック
### empty
– null、空文字、空配列すべてtrueになる## 参考文献
https://qiita.com/shinichi-takii/items/00aed26f96cf6bb3fe62
【PHP】if文で「isset()」を使うより「??」を使うべき理由がコレ
以前ちょっとだけPHPのチームに所属していた時に、タイトルの通り、__ある変数に値が入っていた場合にのみ、その後の処理を行う__ようにコードを書こうとしていました。
なんてことない処理なのですが、自分が思いつくままに書いたコードはこんな感じでした。
“`php
if (isset($someVar)) {
echo(“Uno”);
}
“`そして、そのままプルリクエストを出したのですが、
レビュアーの先輩から「こんな書き方で動かないかな?」というコメントと共にこんなコードを送られました。“`php
if ($someVar ?? “”) {
echo(“Uno”);
}
“`それまでPythonしか触ってこなかったので、「ダブルはてな?なにこれ?」となりました笑
この「??」の働きとしては、ざっくり言うと__「??」の前にある変数に値が無い場合には、「??」の後ろにある変数の値に置換する__というものになります。
基本的な使いかたについては[こちらの記事](https://tektektech.com/php-double-question/
VSCodeのPHP IntelephenseでPHP8.1の記法記載時にエラーがでる
# はじめに
ローカル環境にて、PHP8.1 にバージョンアップしたところ、PHP Intelephense 拡張機能でエラーが出るようになってしまいました。
どうやら readonly アクセス修飾子を型と認識しているようです。![php_intelephense_error.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586387/09e59da7-40a6-1d12-adf9-f7b4d498220d.png)
# 結論
:::note info
settings.json に PHP Intelephense の設定で PHP バージョンを指定すれば OK
:::“`json-doc
{
// ターゲットのPHPバージョンを表すsemver互換の文字列。
// バージョンに適した提案と診断を提供するために使用されます。
// PHP5.3.0以降がサポートされています。
“intelephense.environment.phpVersion”
macOS Monterey(12.0.1)にapacheとphpを設定する
Montereyからapacheのデフォルトでphpがオフになってしまった。
いろんなサイトで情報を継ぎはぎしたので、自分の場合、うまくいった方法をメモる。brewを更新
“`
$ brew update
“`#H2 apacheをインストール
“`
$ brew install apache2
“`/usr/local/etc/httpd/httpd.confの以下を設定/変更。
* Listenを80
* Servernameをlocalhost:80
* mod_include.so がコメントアウトしてあるので、有効化する。
* DocumentRootを設定するapacheをリスタートする。
“`
$ sudo apachectl restart
“`#H2 PHPをインストール
元々、php 8.1が入ってたんだけど、どうやってもapacheとの連携ができなかったので、7.4バージョンを落として環境を作った。“`
$ brew uninstall php
$ brew install install php@7.4
“`
【PHP】filter_inputを使用したサニタイズ
#背景
ユーザーからの入力をデータベースに格納することは基本だと思うので、学んだついでに自分の忘備録として書いています。
#フォームからの入力
入力フォームでユーザーが入れた値を、データベースに格納する。“`html:メモの入力画面
メモの入力
“`
“`PHP:入力を登録する操作
[PMMP] Enum(列挙型)を使おう!
※この記事はPocketMine-API 4.0.0が対象です
# PMMPではEnumがPHP8.1じゃなくても使える!
PMMPには、[EnumTrait](https://github.com/pmmp/PocketMine-MP/blob/4.0.0/src/utils/EnumTrait.php)というTrait(機能)が実装されているので、これを使うことで実装することができます。# Enumを使う理由
Enumを使用しない場合、例えば以下のようなコードになると思います。“`php
class Trump
{
public const SUIT_CLUB = 0;
public const SUIT_DIAMOND = 1;
public const SUIT_HEART = 2;
public const SUIT_SPADE = 3;private int $suit;
public function __construct(int $suit)
{
switch ($suit) {
【Laravel8.4】composer create-project laravelでエラーが出たときの解決方法
#GitBashにコマンドを打ったらエラーが出た。
“`
composer create-project laravel/laravel=”8.4.*” laravel
“`##エラー文
“`
Problem 1
– laravel/framework[v8.12.0, …, 8.x-dev] require league/flysystem ^1.1 -> satisfiable by league/flysystem[1.1.0, …, 1.x-dev].
– league/flysystem[1.1.0, …, 1.x-dev] require ext-fileinfo * -> it is missing from your system. Install or enable PHP’s fileinfo extension.
– Root composer.json requires laravel/framework ^8.12 -> satisfiable by laravel/framework[v8.12.0, ..
『SQLアンチパターン』まとめその3(13〜18章)
[SQLアンチパターン](https://www.oreilly.co.jp/books/9784873115894/)をまとめました。
この本では4つのパートに分けてそれぞれアンチパターンを解説しており、1. [データベース論理設計のアンチパターン(1〜8章)](https://qiita.com/Natsumag/items/c9c91f6fa7a3af6dd1d1 “『SQLアンチパターン』まとめその1”)
1. [データベース物理設計のアンチパターン(9〜12章)](https://qiita.com/Natsumag/items/9eb3c32a3193c74abbe6 “『SQLアンチパターン』まとめその2”)
1. クエリのアンチパターン(13〜18章)
1. [アプリケーション開発のアンチパターン(19〜25章)](https://qiita.com/Natsumag/items/3d8a841a2294d6a24be8 “『SQLアンチパターン』まとめその4”)この記事では「__3. クエリのアンチパターン__」について記述します。
#目次
[第13章-F
Laravel ってなに?
## 勉強前イメージ
聞いたことはある
プログラム的なやつ?## 調査
### Laravel とは?
ララベル と読み、PHPのフレームワークになります。
フレームワークというのは、
システム開発をする際に必要となる機能などがまとまったものになります。
PHPのフレームワークは他にもCakePHP等があります。### Larabel の特徴
– MVCモデルの採用
model,view,controllerに分けられて、
それに伴い開発を進めます。
MVCモデルの使用で、どこに何を書くかが明確になり開発が進めやすくなります。– Composerでパッケージ管理
Composerというパッケージやライブラリを管理するツールで
LaravelはComposerで管理されます。
Composerを使うことで依存性の解決や必要なライブラリがあればインストールされます。– データベースの操作が安易
Eloquent ORMとMifrationというのが備わっているので
データの扱いを柔軟にし、データベースの管理を安易になっています。– 機能やプラグインの開発が
「MySQLでデータベース作成」と「PHPでデータベース記録」。(8日目)
Kotlinのスマホアプリ(クライアント)が、ほぼ完成したので、サーバ側で受信したデータを記録する為、データベースを作成していきます。
サーバは、契約済みのロリポップを使用。
#前回の記事
Kotlinで地図アプリ(ゴミ拾いアプリ)作成。(7日目)
https://qiita.com/fix/items/79afbea4d8c44c5a1f9c
##一週間でやった事
* **GoogleMap APIを使い、地図+位置情報を表示**
* **移動に合わせて、マップがスクロール**
* **ゴミの種類を「大・中・小」にわけ、ボタンアイコンを作成**
* **ボタンにイメージアイコンを作成**
* **ボタンタップ後、サーバー側へHTTPS(GET)でデータを送信(BASIC認証)**
* **送信前に確認ダイアログを表示**
* **送信後、地図上にアイコンを表示**
* **アイコンタップで、種別/時間を表示**
* **サーバー側でBASICに認証**
* **サーバー側でPHPを使いGETデータ記録テスト**#ロリポップサーバでデータベースを作成
ログインし、
LaravelのcommandでUser以外のDBデータをEloquentで取り出せない件
## TL;DR
Laravelは便利なもので、php artisan hogehoge ってコマンドを簡単に作れます。
これを利用して定期実行させたりもできて使っているのですが、、**User以外のmodel呼び出しでeloqunet使えない!!!**
結局、インジェクションのリスクが少ない箇所だったので、直接SQL叩いて解決しました。“`DB::select(DB::raw())“`
# 症例
例えば
app/Console/Commands/HogeCommand.php
“`php
public function handle()
{
$users=User::get();
//色々な処理
return Command::SUCCESS;
}“`
これは出来るわけです。
でも、このユーザーに紐付いた日記テーブル(diaries)から値を取ろうとすると
“`php
public function handle()
{
$users=User:
JSON データを POST で受けるテストサーバを作る
IoTデータを受けるサーバでは、API として JSON データを POST するものが多い。
ちゃんと JSON データが送られているかな? とデバッグする時に、自前でちゃちゃっとテストサーバーを作ってみる。# PHP スクリプト
“`
“`
最初は
“`
// $data = $_POST[‘data’];
// echo $data;
“`としていたが、JSONのPOSTは通常のPOSTメソッドじゃないということで、上記のように
Laravelで直接SQL文を実行する
Laravelで直接SQLを実行するにはその種類によってメソッドが変わります。参照系の場合には `DB::select()` を利用します。
“`php
$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()` を使います。
“`php
DB::unprepared( ‘LOCK TABLES ‘ .
DB::getTablePrefix() . ‘input_tmps1 WRITE,’ .
DB::getTablePrefix() . ‘input_tmps2 WRITE,’ .
DB::getTablePrefix() . ‘input_tmps3 WRITE, ‘ .
DB::
[PMMP]パーミッションを使う
※この記事では執筆時点で安定バージョンのPocketMine-MP API4.0.0に準拠しています。
# パーミッションとは
権限です(そりゃそうだ)、コマンドの実行権限を制御するのに使われることが一番多いと思います。
でも、どうやって使えばいいのか、なんで使ったほうがいいのか分からない人もいるかもしれません。
使ってみるとそこまで難しくはないので、是非使ってみてください。お願いします。使ってください…….# パーミッションを使う理由
– OPであるかどうかに依存しない
– プレイヤーごとにパーミッションを与えるか制御することができる(e.g. VIPユーザー(OPではない)もOP専用コマンドを使用できるようにする)
– コマンドリスト(helpなど)にパーミッションが無くて使えないコマンドを表示させない
– `Permissible->hasPermission(DefaultPermissions::ROOT_OPERATOR)`とか訳分からん長い謎の定型文を書かなくていい!!# 使い方
## パーミッションを登録する
パーミッションは、許可する物事ごとに
Laravel7以下向けパッケージ開発でSeederにFactoryを使う
## 対象
* Laravel5,6,7系向けのパッケージ開発を行おうと思っている人
* パッケージとしてデータベースにデータを登録する必要がある
* パッケージ開発自体はやったことがある## 概要
* composer.json の autoload で seeder や factory を読み込むようにする
* factory をパッケージ側でロードする
* seeder で factory を利用する
* seeder を組み込み側で呼び出す## 詳細
`Vendor`, `Package` のところはそれぞれ置き換える。
クラス名などはそれぞれ好きなように。
ディレクトリ構造も例であって、autoload やパスを正しく設定できれば好きな構造で問題ない。### ディレクトリ構造
– database
– factories
– UserFactory.php
– seeds
– DemoSeeder.php
– migrations
– src
– ServiceProvider.php
–