20210101のPHPに関する記事は8件です。

PHPをvscode remote containerで開発したかった

はじめLaravel入れていたが、template的に使えるものが欲しかったので作った。

https://github.com/moeyashi/template-php-on-vscode-remote-container

Laravel入れたバージョンも作ろうかなと思います。

2020-01-02 追記

Laravel入れました。勢いあまってlaravel/ui authまで入った。

https://github.com/moeyashi/template-laravel-on-vscode-remote-container

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【PHP学習メモ】preg_match 定数の指定

あけましておめでとうございます。
あっという間に2021年ですね。
善き一年になりますように。

【今日の学び】
preg_match は、正規表現によるマッチングを行うことができます。

【構文】
preg_match ( string $pattern , string $subject [, array &$matches = null [, int $flags = 0 [, int $offset = 0 ]]] ) : int|false

引数 $pattern には、検索する文字列を、 $subject には、検索対象の文字列を、[] 部分はオプションで省略可能です。

〜PHPマニュアル〜
https://www.php.net/manual/ja/function.preg-match.php

今回学んだのは、検索する文字列に、『定数』を指定する方法です。

・・・省略・・・
// 定数
const THREE_TIMES_RATIO_DAY = 3;
const FIVE_TIMES_RATIO_DAY = 5;

・・・省略・・・

if (preg_match ('/' . self::THREE_TIMES_RATIO_DAY . '/' , $date)) {
・・・省略・・・
}

このように、連結演算子「.」を使用することで、『定数』を指定することができます。
※同様に『変数』もこの記述方法で指定することができます。

日々の学びを少しずつアウトプットしていきます。
間違いなどありましたら、お手数ですが、ご指摘頂けましたら幸いです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

dockerに苦労した話

今回の教材

Laravelでテスト駆動開発を学ぼう!

課題に取り組む前にLaravelのMigrateで沼にハマる

Reset

docker desktop のアンインストール
スタート -> 設定 -> アプリ(ふつーに消えてくれる)
image.png
explorerで普通に消そうとするとブルースクリーンが出て再起動になり、永遠に消せない(この時代にブルースクリーンなんて久しぶりに見たわ...)。powershell管理者モードでバチンと消すしか無いらしい
image.png

learning-laravel-tddというディレクトリが基準
PS C:\WINDOWS\system32> cd D:\OneDrive\dev
PS D:\OneDrive\dev> rm -Force learning-laravel-tdd

Docker Desktop for Windows のインストール

https://hub.docker.com/editions/community/docker-ce-desktop-windows/
インストール自体はすんなりいく

Docker 用 git リポジトリのクローン

OneDrive\dev>
$ mkdir learning-laravel-tdd
$ cd learning-laravel-tdd
$ git clone https://github.com/nunulk/learning-laravel-tdd-docker docker
$ mkdir app

現在の状態

learning-laravel-tdd
├── app
└── docker
Dockerを起動してからやってね
$ cd docker
$ cp .env.example .env
$ docker-compose up -d 

Portのかぶりを解決する(DB_PORTを3308に)

僕の場合は 3306 がかぶっていることがわかった(普段pythonで使ってるから)
image.png

learning-laravel-tdd\docker\.env
COMPOSE_PROJECT_NAME=learning-laravel-tdd
APP_PATH=../app
TZ=Asia/Tokyo
WEB_PORT=80
- DB_PORT=3306
+ DB_PORT=3308
DB_DATABASE=learning_laravel_tdd
DB_USERNAME=root
DB_PASSWORD=root
DB_TESTING_DATABASE=learning_laravel_tdd_testing
DB_TESTING_PORT=3307
DB_TESTING_USERNAME=root
DB_TESTING_PASSWORD=root

するとDockerのコントロールパネルでstartしたときに全部つく
image.png

動作確認

以下のコマンドを実行して、すべてのコンテナが起動しているかどうか確認

learning-laravel-tdd\docker>
$ docker-compose ps
              Name                             Command              State                 Ports
-------------------------------------------------------------------------------------------------------------
learning-laravel-tdd_app_1          docker-php-entrypoint php-fpm   Up      9000/tcp
learning-laravel-tdd_db-testing_1   docker-entrypoint.sh mysqld     Up      0.0.0.0:3307->3306/tcp, 33060/tcp
learning-laravel-tdd_db_1           docker-entrypoint.sh mysqld     Up      0.0.0.0:3308->3306/tcp, 33060/tcp
learning-laravel-tdd_web_1          nginx -g daemon off;            Up      0.0.0.0:80->80/tcp

アプリケーションの初期化

learning-laravel-tdd\docker>
$ docker exec -it learning-laravel-tdd_app_1 ash
# composer create-project --prefer-dist "laravel/laravel=7.*" .
learning-laravel-tdd\app\.env
# 中略

LOG_CHANNEL=stack


- DB_CONNECTION=mysql
- DB_HOST=127.0.0.1
- DB_PORT=3306
- DB_DATABASE=laravel
- DB_USERNAME=root
- DB_PASSWORD=
+ DB_CONNECTION=mysql
+ DB_HOST=db
+ DB_PORT=3306
+ DB_DATABASE=learning_laravel_tdd
+ DB_USERNAME=root
+ DB_PASSWORD=root
+ DB_TESTING_HOST=db-testing
+ DB_TESTING_PORT=3306
+ DB_TESTING_DATABASE=learning_laravel_tdd_testing
+ DB_TESTING_USERNAME=root
+ DB_TESTING_PASSWORD=root

BROADCAST_DRIVER=log

# 中略
learning-laravel-tdd\app\config\database.php
        'mysql' => [
            'driver' => 'mysql',
            'url' => env('DATABASE_URL'),
            'host' => env('DB_HOST', '127.0.0.1'),
-           'port' => env('DB_PORT', '3306'),
+           'port' => env('DB_PORT', '3308'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'prefix_indexes' => true,
            'strict' => true,
            'engine' => null,
            'options' => extension_loaded('pdo_mysql') ? array_filter([
                PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
            ]) : [],
        ],


+       'mysql_testing' => [
+           'driver' => 'mysql',
+           'host' => env('DB_TESTING_HOST', '127.0.0.1'),
+           'port' => env('DB_TESTING_PORT', '3307'),
+           'database' => env('DB_TESTING_DATABASE', 'forge'),
+           'username' => env('DB_TESTING_USERNAME', 'forge'),
+           'password' => env('DB_TESTING_PASSWORD', ''),
+           'unix_socket' => env('DB_SOCKET', ''),
+           'charset' => 'utf8mb4',
+           'collation' => 'utf8mb4_unicode_ci',
+           'prefix' => '',
+           'prefix_indexes' => true,
+           'strict' => true,
+           'engine' => null,
+           'options' => extension_loaded('pdo_mysql') ? array_filter([
+               PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
+           ]) : [],
+        ],

         'pgsql' => [
             'driver' => 'pgsql',
             'url' => env('DATABASE_URL'),
learning-laravel-tdd\app\phpunit.xml
        <server name="CACHE_DRIVER" value="array"/>
-       <!-- <server name="DB_CONNECTION" value="sqlite"/> -->
-       <!-- <server name="DB_DATABASE" value=":memory:"/> -->
+       <server name="DB_CONNECTION" value="mysql_testing"/>
+       <server name="DB_DATABASE" value="learning_laravel_tdd_testing"/>       
        <server name="MAIL_MAILER" value="array"/>

Models ディレクトリの作成と User.php の移動

Laravel は、デフォルトでは Model クラスを artisan コマンドで生成すると app ディレクトリ直下に生成しますが、本教材では、Models ディレクトリを作って、そこに配置していきます。インストールで自動的に作られる User.php をあらかじめ Models ディレクトリに移しておきましょう。

まずは以下のコマンドを実行してディレクトリを作成します(コンテナ側でもホスト側でもどちらでも大丈夫です)。

learning-laravel-tdd\app
# mkdir app/Models

続いて、app/User.php を app/Models 以下へ移動し、名前空間を変更します。

learning-laravel-tdd\app\Models\User.php
namespace App\Models;

User クラスを参照している箇所の名前空間もあわせて変更します。

変更するのは以下の2つのファイルです。

learning-laravel-tdd\app\config\auth.php
'providers' => [
    'users' => [
        'driver' => 'eloquent',
-       'model' => App\User::class,
+       'model' => App\Models\User::class,
    ],
learning-laravel-tdd\app\database\factories\UserFactory.php
- use App\User;
+ use App\Models\User;

config is ignored

learning-laravel-tdd\docker\db\my.cnf を読み取り専用にする
Windowsだけの問題らしい

mysqld: [Warning] World-writable config file '/etc/mysql/my.cnf' is ignored. がでる
[Docker+Windows]mysqlのdockerイメージがmy.cnfのマウントのエラーで起動しない時の対処法

アプリケーションの確認

最後に、アプリケーションが動作するか確認するため、コンテナ内で以下のコマンドを実行してください。

/app # php artisan migrate
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

型宣言についてまとめる

これまでしてこなかった型宣言について
公式の内容を纏めて自分なりに解釈してみました。

参考: PHP.net

なぜ型宣言をするのか?

そもそもの型宣言とはなにか?

関数のパラメータや戻り値、 クラスのプロパティ (PHP 7.4.0 以降) に対して型を宣言することができます。 これによって、その値が特定の型であることを保証できます。 その型でない場合は、TypeErrorがスローされます。

自分なりに解釈すると
パラメータや戻り値が定義されていることで求めた型以外が参照された場合に
エラーを返すことによって大きなバグになることを事前に防いでいるのかと考えます。
またバグ出た際の原因追求もしやすくなるのかなと思います。

わかりやすく言うと
スーパーとかがイメージしやすいのかなと!
お酒コーナーにはお酒をおいてあるのでそこから持ち出したら
もちろんお酒を持っていくことになりますよね!
お菓子コーナーから商品を持ち出したらそれはもちろんお菓子です。
そのメソッドを使ってどんな反応が返ってくるのか
その範囲、カテゴリを指定することでおおよその返り値を想定することが出来る。
そんなイメージがわかりやすいかなと思います。

基本的な型

説明 ver
クラス/インターフェイスの名前 値が指定したクラスやインターフェイスのインスタンでなければいけません。
self 値がそのメソッドが定義されているクラスと同じクラスのインスタンスでなければいけません。クラスの内部でのみ使えます。
array 値が配列でなければいけません。
callable 値がcallableでなければいけません。クラスのプロパティの型では宣言できません。
bool 値がbool値でなければいけません。
float 値がfloatでなければいけません。
int 値がintでなければいけません。
string 値が文字列でなければいけません。
iterable 値が配列か、Traversableのインスタンスでなければなりません。 PHP 7.1.0以降
object 値がobjectでなければなりません。 PHP 7.2.0以降
mixed 値はあらゆる値であることが出来ます。 PHP 8.0.0以降

※union型

型をunionとして宣言するとひとつではなく複数の異なる型を値として受け入れることが出来る。

<?php
function getItem(): T1|T2...
{
    //返り値はT1|T2となる
}

※mixed型

mixed型は
array|bool|callable|int|float|object|resource|string|null
と同等の型です。

Nullを許容する型宣言

型の名前の前にクエスチョンマークを付けることで
返り値がnullである場合も許容される

<?php
function getItem(): ?string
{
    //返り値はnull|stringのどちらかである
}

返り値でのみ有効な型

void

voidは関数が値を返さないことを示す戻り値の型

static

値が、メソッドが呼び出されているクラスと同じインスタンスでなければいけない。

型宣言は完全でもなければ最低限でもない

他の言語のことは知らないのでなんとも言えませんが
型の扱いがゆるいイメージのPHP特有なのか
型宣言をしたからと言って必ずしもその型で扱われているとも限らない
わかりやすい例でコードを書くと

<?php
function getItem(): int|string
{
    //
    return true;
}

上記のコードでは
true = 1
とした扱いになり
intとboolは互換性がありエラーとはならないので
型を定義したのであればしっかりと定義した型で
返してあげるようにしたほうがいいかと思います。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MySQLデータテーブルにPHPで作成したフォームのデータを書き込む

参考

https://qiita.com/ho-gaku/items/914e80a955b510538377
https://qiita.com/harufuji/items/d033d3480a0c791973ae

手順

前回同様に、
1.データベースに接続
2.接続エラー処理
3.テーブルデータ取得
4.表示処理
5.データベース接続終了

新たに、
1.フォーム作成
2.フォームに入力されたデータを受け取ってDBに接続し書き込む。

前回のコードサンプル

<?php

$link = mysqli_connect('localhost', 'root', ''   ,'eccube001');
//           ↑host  ↑USER  ↑PW(空白)    ↑DB名前
// 接続状況をチェックします
if (mysqli_connect_errno()) {
    die("データベースに接続できません:" . mysqli_connect_error() . "\n");
}else {
    echo "データベースの接続に成功しました。\n";
}

print "<br>";

// ステータスの一覧を表示する
$query = "SELECT * FROM mtb_order_status;";
//     ↑まずはサンプルで固定のSQLを入れる(サンプル・動作確認としてこのまま)
// クエリを実行します。
if ($result = mysqli_query($link, $query)) {
    echo "SELECT に成功しました。\n";

print "<br>";

    foreach ($result as $row) {
        var_dump($row);

    }
}else{
    echo "SQL実行に失敗しました。\n";
}

// 接続を閉じます
mysqli_close($link);

?>

今回

銀行口座の入出金の機能を最終的に作成するために、今回は銀行口座開設フォームを作成する。

銀行口座に必要な機能

・口座開設フォーム
・入出金を記録、確認できる

DBに書き込む

前回と同様に、DBに接続します。そして、フォームに入力されたデータをPOSTで受け取ってDBに接続しinsertで書き込む。

$link = mysqli_connect('localhost', 'root', ''   ,'AIBANK');
if (isset($_POST['send']) === true) {
    $number= htmlspecialchars(trim($_POST["number"]));
    $type = htmlspecialchars(trim($_POST["type"]));
    $name_full= htmlspecialchars(trim($_POST["name_full"]));
    $name_kana = htmlspecialchars(trim($_POST["name_kana"]));
    print($name_full);

    $query = "INSERT INTO account_170(number, type, name_full, name_kana, create_date,flg_active) VALUES ('$number','1','$name_full', '$name_kana',CURRENT_TIMESTAMP,'1');";
}

ステータスを表示する

テーブルデータを取得、表示しinsertされたデータをここに表示する。

$query = "SELECT * FROM account_170;";

if ($result = mysqli_query($link, $query)) 
    print "<table border=''>";

    foreach ($result as $row) {        

        print "<tr>";

        print "<td>" . $row["number"] . "</td>";
        print "<td>" . $row["type"] . "</td>";
        print "<td>" . $row["name_full"] . "</td>";
        print "<td>" . $row["name_kana"] . "</td>";
        print "<td>" . $row["create_date"] . "</td>";
        print "<td>" . $row["flg_active"] . "</td>";

        print "</tr>\n";

    }


print "</table>";    

mysqli_close($link);
print "<hr>";
?>

入力フォームを作成する

htmlでフォームを作成する

<body>
    <form action="" method="post">
        <h2>口座番号登録フォーム</h2>
        <p>口座番号 :
        <input type="text" id="number" name="number" size="60" placeholder="2020112"> 
        </p>
        <p>
            預金種別 : 
            <input type="radio" id="type" name="type" value="1">普通預金
            <input type="radio" id="type" name="type" value="2">当座預金
        </p>
        <p>
            <label>預金者名 : </label>
            <input type="text" id="name1" name="name1" size="60" placeholder="山田太郎"> 
        </p>
        <p>
            預金者名(かな) :
            <input type="text" id="name2" name="name2" size="60"placeholder="ヤマダタロウ">
        </p>
        <p><input type="submit" name ="send" value="口座開設を登録する" onclick="clickbtn()"></p>
    </form>


</body>

サンプルコード

銀行口座開設フォームが完成

<!DOCTYPE html>
<html lang="ja">



<?php
$link = mysqli_connect('localhost', 'root', ''   ,'AIBANK');
if (isset($_POST['send']) === true) {
    $number= htmlspecialchars(trim($_POST["number"]));
    $type = htmlspecialchars(trim($_POST["type"]));
    $name_full= htmlspecialchars(trim($_POST["name_full"]));
    $name_kana = htmlspecialchars(trim($_POST["name_kana"]));
    print($name_full);

    $query = "INSERT INTO account_170(number, type, name_full, name_kana, create_date,flg_active) VALUES ('$number','1','$name_full', '$name_kana',CURRENT_TIMESTAMP,'1');";
}


if ($result = mysqli_query($link, $query)) {
    echo "成功しました。\n";
    print "<br>";
}else{
    echo "失敗しました。\n";
    print "<br>";
}
$query = "SELECT * FROM account_170;";

if ($result = mysqli_query($link, $query)) 
    print "<table border=''>";

    foreach ($result as $row) {


        print "<tr>";

        print "<td>" . $row["number"] . "</td>";
        print "<td>" . $row["type"] . "</td>";
        print "<td>" . $row["name_full"] . "</td>";
        print "<td>" . $row["name_kana"] . "</td>";
        print "<td>" . $row["create_date"] . "</td>";
        print "<td>" . $row["flg_active"] . "</td>";



        print "</tr>\n";





    }


print "</table>";    

mysqli_close($link);
print "<hr>";
?>



<body>
    <form action="" method="post">
        <h2>口座番号登録フォーム</h2>
        <p>口座番号 :
        <input type="text" id="number" name="number" size="60" placeholder="2020112"> 
        </p>
        <p>
            預金種別 : 
            <input type="radio" id="type" name="type" value="1">普通預金
            <input type="radio" id="type" name="type" value="2">当座預金
        </p>
        <p>
            <label>預金者名 : </label>
            <input type="text" id="name1" name="name1" size="60" placeholder="山田太郎"> 
        </p>
        <p>
            預金者名(かな) :
            <input type="text" id="name2" name="name2" size="60"placeholder="ヤマダタロウ">
        </p>
        <p><input type="submit" name ="send" value="口座開設を登録する" onclick="clickbtn()"></p>
    </form>



</body>

</html>

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

laravel MySQL tinyInteger型のカラムはchangeできない

目的

  • マイグレーションファイルを用いてTinyInt型のカラム情報を変更しようとしたけどエラーが出たのでまとめる

情報

  • 今回の事例はすでに作成されているTinyInt型カラムのコメントを変更しようとした。

エラーまでの経緯

  1. マイグレーションファイルのup側に下記のように記載してカラムのコメントを変更しようとした。

    $table->tinyInteger('カラム名')->comment('変更後のコメント')->change();
    
  2. 下記コマンドを実行してマイグレーションを実行した。

    $ php artisan migrate
    

エラー

  • 下記のエラーが出力された。

    Unknown column type "tinyinteger" requested. Any Doctrine type that you use has to be registered with \Doctrine\DBAL\Types\Type::addType(). You can get a list of all the known types with \Doctrine\DBAL\Types\Type::getTypesMap(). If this error occurs during database introspection then you might have forgotten to register all database types for a Doctrine Type. 
    Use AbstractPlatform#registerDoctrineTypeMapping() or have your custom types implement Type#getMappedDatabaseTypes(). If the type name is empty you might have a problem with the cache or forgot some mapping information.
    

原因

  • 公式ドキュメントにこんな記載を発見した。https://readouble.com/laravel/6.x/ja/migrations.html

    Note: 以降のカラムタイプのみ変更可能です:bigInteger、binary、boolean、date、dateTime、dateTimeTz、decimal、integer、json、longText、mediumText、smallInteger、string、text、time、unsignedBigInteger、unsignedInteger and unsignedSmallInteger
    
  • このドキュメントによるとTinyIntegerはchangeメソッドを用いた変更をする事ができない。

解決までの経緯

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Docker環境でDBに接続するとcould not find driverが出たときの対処方法

DBに接続する処理を作成

<?php
define('DB_NAME', 'データベース名');
define('USER_NAME', 'ユーザー名');
define('USER_PASS', 'パスワード');

try {
  $pdo = new PDO(
    DB_NAME,
    USER_NAME,
    USER_PASS,
    [
      PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
      PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ,
      PDO::ATTR_EMULATE_PREPARES => false
    ]
  );
} catch (PDOException $e) {
  echo $e->getMessage();
  exit;
}

接続すると下記のエラーが出力された

could not find driver

ドライバが見つからないようなので現在のドライバを確認してみる

php -m | grep pdo

# pdo_sqlite

pdo_mysqlがインストールされていないのが原因らしいのでDockerFileに処理を追加する

FROM php:7.2-fpm
COPY php.ini /usr/local/etc/php/

# 追加
RUN docker-php-ext-install pdo_mysql

再度ビルドすると無事に接続できた!

参考資料【Laravel】CentOSのLAMP環境でcould not find driver

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel】結局どう違うの?Eloquent, DBクラス, クエリビルダ 前編

困りごと

PHP歴3ヶ月、Laravel歴1ヶ月の初学者です。LaravelのDBの操作方法はEloquent ORM・DBクラス・クエリビルダに分類されます。表示されればなんでもOKというからレベルを一段階上げていきたい初学者がこれらの違いについてまとめました。

前編:各記述法の違いについて。(今回)
後編:どのように記述法を選択していくのか(次回)

開発環境

PHP 7.2.34 / Laravel 6.20.5

記述法を比較

①DBファザードはIlluminate\Support\Facades\DBクラスによる記述法。
②Eloquent ORMはIlluminate\Database\Eloquent\Modelクラスを継承する記述法。
それぞれ見ていきます。

①DBクラスの記述 (DBファザード)

DBクラスによる記述のためIlluminate\Support\Facades\DBをuseする。

Controller.php
 use Illuminate\Support\Facades\DB;

⭐️ DBファザード パターン①

DB::SQL値(SQL文、パラメータ配列)のように引数に直接SQL文を用いて記述する。
SQL値にはinsertやupdateなどの基本的なSQLのメソッドは揃っている。

記述例

controller.php
 public function query(Request $request) {
  //SELECT文
  $items = DB::select('select * form users where id = ?',[1]);  
  //INSERT文
  DB::insert('insert into users (id, name) values (?,?)',[1,'たかし']);
  //UPDATE文
  DB::update('update users set age = 100 where id = ?, [2]');
  //DELETE文
  DB::delete('delete from users');
 }

Laravel公式リファレンス(DBファザード)
https://readouble.com/laravel/5.dev/ja/database.html

⭐️ DBファザード パターン②

SQL文を生成するためのメソッドをメソッドチェーンで記述することによりデータベースを操作する。
DB::table('テーブル名')->メソッド()のように記述する。

記述例
・usersテーブルから、フィールド名(id)とパラメータ(requestされたid)が同じレコードを取得

Controller.php
 public function select(Request $request) {
   $items = DB::table('users')->where('id',$request->id)->first();
   return view('index',['items' => $items]);
 }
  //DB::table('テーブル名')->where('フィールド名',パラメータ)->first() 

・usersテーブルの内容をリクエストされた値へ変更(フィールド名とパラメータが同じレコードに対しての処理)

Controller.php
 public function update(request $request) {
   $param = [
     'id' => $request->id,
     'name' => $request->name,
     'comment' => $request->commment,
   ];
   DB::table('users')->where('id',$request->id)->update($param);
 }
 //DB::table('テーブル名')->where('フィール名',パラメータ)->update(パラメータ);

Laravel公式リファレンス(クエリビルダ)
https://readouble.com/laravel/5.dev/ja/queries.html

また、クエリの中で直接SQLを使用したい場合はDB::rawメソッドを使用する。

Countroller.php
$users = DB::table('users')
                  ->select(DB::raw('count(*) as count, status'))
                  ->where('status','<>',1)
                  ->groupBy('status')
                  ->get();

参考:https://readouble.com/laravel/5.7/ja/queries.html

余談ですが、

DBファサードでの insert もしくは update では created_at や updated_at は更新されません。
Eloquent を利用したときのみです。

とのことです。私はこれが原因で値が保存されずにハマったことがあります。
参考:https://laraweb.net/knowledge/2347/

②Modelクラスの記述 (Eloquent ORM)

※Eloquent ORMの基本の考え方 例:usersテーブル

①1つのクラスがDBの1テーブルに対応 $users = User::all()
②クラスの1インスタンス(オブジェクト)は、DBの1レコードに対応 $user = new User()
③クラスの属性は、テーブルの各カラムに対応 {{$user->comment}}
EloquetORM.png

⭐️ Eloquent ORM

モデルクラスによる記述のためApp\Model名をuseする。

Controller.php
use App\Models\User;    //Modelsディレクトリの配下にUserモデルを生成。

記述例
・usersテーブルの全ての値を、Collection型として取得してview(index)へ渡す

Controller.php
public function select(Request $request)
{
 $item = User::all();  
 return view('index',['items' => $items]); 
}

・usersテーブル内でリクエストされたnameフィールドと同じ値のレコードを、Collection型として取得しview(index)へ渡す。

Controller.php
public function search($Request $request) 
{
 $item = User::where($request->name)->get();  //クラス名::where(検索する値')->取得方法
 return view('index',['items' => $items]);
}

参考:
https://blog.ytake.jp.net/entry/2015/12/16/011812
https://qiita.com/gone0021/items/f1e8223c94dbaab22fca

最後に

書き方の違いについてざっくりまとめました。書き方が多くあるが故に、僕のような初学者は選択に困ってしまう部分だと思います。理解がより深まるようにメリデメについてまとめたかったのですが、長くなってきたので後編に書きます。
この内容は奥が深いようなので、実務経験を元にさらにブラッシュアップしていきます。
(本内容に誤りがありましたらご指摘いただけると幸いです。)

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む