20200331のPHPに関する記事は15件です。

PHP学習記 #3日目

useとは

名前空間の拡張機能であって、クラス、関数、定数などをインポートするときに使用する。

stmt

PDOStatementオブジェクトを示すことが多い。

queryとprepareの違い

PDO(PHP Data Object)でのクエリの実行には2種類の存在する。それが、query()とprepare()である。
queryメソッドを利用してSQL文を実行する際は、ユーザーからの入力をSQL文に含めることが出来ない。しかし、prepareメソッドを利用して、SQL文を実行する際は、ユーザーからの入力をSQL文に含めることができる。

try-catchとは

tryブロックにはメイン処理に必要な処理を記述する。catchブロックにはメイン処理に例外が発生した場合、その情報をキャッチし、異常処理を記述する。

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

jsson_encodeとserializeでハマった話

はじめに

サイト共通の重い計算処理を各ページでやるコストが高いので、処理結果をobj化してDBに保存して使いまわしたい
・・・と考えた。

最初にやってみた方法

保存用テーブル

CREATE TABLE IF NOT EXISTS `xxxx_save_t` (
  `xxxx_save_id` int(11) NOT NULL AUTO_INCREMENT,
  `data` longblob NOT NULL,
  `create_time` datetime NOT NULL,
  `update_time` datetime NOT NULL,
  `delete_time` datetime DEFAULT NULL,
  `delete_flg` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`xxxx_save_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

保存処理

 $obj = xxxx //何某かの処理が終わった状態結果を持つインスタンス
 db::save(json_encode($obj));

読み込み処理

  $data = db::SelectById($id);
  $obj = json_decode($data['data']);

なぜか一部のデータが消える!

  • $objが持つはずのプロパティが消える・・・

原因

json_encodeでオブジェクトを保存する場合、対象はpublicプロパティのみ
インスタンスのprivate/protect変数も状態として保存したい場合には向かない。
あとは配列とオブジェクトが混ざってるような場合もserializeの方が良さそうか。
【PHP】オブジェクトをjsonエンコード

再現

    class CustomDateTime {
        public $_dateTime = null;
        protected $_dateStr     = "";
        protected $_isSet       = false;

        public function __construct($date) {
            $this->_dateTime = new DateTime($date);
            $this->_dateStr = $date;
            $this->_isSet = true;
        }
    }

    public function test() {

        $tmpData = [
            'array'         => [1,2,3],
            'customDateTime'    => new CustomDateTime('2020-1-1'),
        ];
        var_dump($tmpData);
        var_dump("<br/><br/>");

        $tmpData2 = json_decode(json_encode($tmpData));
        var_dump($tmpData2);exit;
    }

結果

array(2) { ["array"]=> array(3) { [0]=> int(1) [1]=> int(2) [2]=> int(3) } ["customDateTime"]=> object(CustomDateTime)#43 (3) { ["_dateTime"]=> object(DateTime)#44 (3) { ["date"]=> string(19) "2020-01-01 00:00:00" ["timezone_type"]=> int(3) ["timezone"]=> string(10) "Asia/Tokyo" } ["_dateStr":protected]=> string(8) "2020-1-1" ["_isSet":protected]=> bool(true) } } string(10) "

object(stdClass)#45 (2) { ["array"]=> array(3) { [0]=> int(1) [1]=> int(2) [2]=> int(3) } ["customDateTime"]=> object(stdClass)#46 (1) { ["_dateTime"]=> object(stdClass)#47 (3) { ["date"]=> string(19) "2020-01-01 00:00:00" ["timezone_type"]=> int(3) ["timezone"]=> string(10) "Asia/Tokyo" } } }

jsonを介した時点で非publicなdateStr/isSetが抹消された

対策

配列やオブジェクトのpublic変数だけでよければjson_encodeでよいがprotectの状態なども持たせたい場合はserializeを使う
Serialize PHP:Manual

Serializeを使ってみる

    public function test() {

        $tmpData = [
            'array'         => [1,2,3],
            'customDateTime'    => new CustomDateTime('2020-1-1'),
        ];
        var_dump($tmpData);
        var_dump("<br/><br/>");

        $tmpData2 = unserialize(serialize($tmpData));
        var_dump($tmpData2);exit;
    }

結果

array(2) { ["array"]=> array(3) { [0]=> int(1) [1]=> int(2) [2]=> int(3) } ["customDateTime"]=> object(CustomDateTime)#43 (3) { ["_dateTime"]=> object(DateTime)#44 (3) { ["date"]=> string(19) "2020-01-01 00:00:00" ["timezone_type"]=> int(3) ["timezone"]=> string(10) "Asia/Tokyo" } ["_dateStr":protected]=> string(8) "2020-1-1" ["_isSet":protected]=> bool(true) } }

array(2) { ["array"]=> array(3) { [0]=> int(1) [1]=> int(2) [2]=> int(3) } ["customDateTime"]=> object(CustomDateTime)#45 (3) { ["_dateTime"]=> object(DateTime)#46 (3) { ["date"]=> string(19) "2020-01-01 00:00:00" ["timezone_type"]=> int(3) ["timezone"]=> string(10) "Asia/Tokyo" } ["_dateStr":protected]=> string(8) "2020-1-1" ["_isSet":protected]=> bool(true) } }

非publicな状態も含めて変換された。

その他メモ

serializeは環境によっては文字関連でエラーになったりするそう
serialize VS json_encode 〜人類の存亡とか仁義とか全く関係ない戦い〜

保存サイズはjson_encodeの方が小さい。そりゃね。

まとめ

  • 配列で使うならさして違いは無い
  • オブジェクトを利用する場合スコープの影響が発生してくる
  • 純粋なデータの保存用途だけあればjson_encodeを使った方がコンパクト
  • 中身まで同じオブジェクトを再現したいのであればserializeがよさげ
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Migrate:refreshもだめ、phpMyAdminもだめ。

今日、Laravelのサーバーでgit pullした後に、migrate:refreshをしようとしたらエラーが発生してしまいました。

原因は、migrationの名前を変更したことなのですが、さらに問題が発生しました。

phpMyAdminに入れねぇ。。

phpMyAdminがサーバー側のエラーで入れませんでした。

そこで考えました。

PHPでテーブル消すコード書けば良くね?

ということで、サーバーへのアクセス制限をしたのちに下のコードでテーブルを全て消しました。

<?php
$dbh = new PDO ('mysql:dbname=DB名;host=ホスト名;charset=utf8;','ユーザー名','パスワード');
$stmt = $dbh->query('SHOW TABLES');
while($re = $stmt->fetch(PDO::FETCH_ASSOC)){
  echo $re['Tables_in_DB名'].',';
  $dbh->query('DROP TABLE '.$re['Tables_in_DB名']);
}

こんな感じです。

2~3回実行して何も表示されなくなれば完璧です。

後は、php artisan migrateしましょう。

最後に

いや、これコマンドでのmysqlで済む話だったかも。。。

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

PhpStormでPSR-12に準拠させる

Preferences -> Editor -> Code Style -> PHP
までいき、Set from...をクリックすると、その中にPSR-12がある。
PhpStormでPSR-12に準拠させる.png
そこから選べばOK。

あとはReformat Code(Option + Command + L)でコードを修正。

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

phpのCarbonで月の計算をするときの注意点

phpの日付操作の定番ライブラリであるCarbonについてです。

問題点

「10月31日」に1ヶ月足すと何日が正解でしょうか?
感覚的には「11月30日」になってほしいのではないでしょうか?
CarbonではaddMonth()addMonths()で1ヶ月足すと

Carbon::parse('2018-10-31')->addMonth()->toDateString(); // 2018-12-01

2018-12-01になってしまいます。

こうなることを知ってないとプログラム中で意図しないことになる場合があります。
やっかいなのは月末くらいしかこのパターンにならないためテスト中に問題に気付きにくいことです。

この問題を解決する方法はいくつかあります。

addMonthNoOverflow()

addMonth()のかわりにaddMonthNoOverflow()を使います。

これを使うと

Carbon::parse('2018-10-31')->addMonthNoOverflow()->toDateString(); // 2018-11-30

2018-11-30となります。

デフォルトのaddMonth()でこの動きをしてほしい気がしますが・・・

useMonthsOverflow(false)

いろんなところでaddMonth()が必要な場合、いちいちaddMonthNoOverflow()を使うのは面倒な場合があります。

そんなときはCarbon::useMonthsOverflow(false)をしてやると、addMonth()のメソッドを使ったときの動きがaddMonthNoOverflow()の動きになります。

Carbonはシングルトンでこの設定値は保持されるので、一度設定してやるとどこでaddMonth()使ってもaddMonthNoOverflow()の動きになります。
もしデフォルトの動きをしたい場合はaddMonthWithOverflow()を使ってやるともとの動きになります。

settings(['monthOverflow' => false])

これはCarbonのバージョン2から利用できます。

settingsは全体に設定するものではなく、個々に設定する場合に使うイメージです。

Carbon::parse('2018-10-31')->settings(['monthOverflow' => false])->addMonth()->toDateString(); // 2018-11-31

ちなみに

subMonth()でもこの問題が起こります。

例えば「10月31日」にsubMonth()すると「9月30日」ではなく、「10月1日」となります。

addYear()もうるう年でずれるようで、useYearsOverflow()なんてものが用意されてます。

Carbon::parse('2016-02-29')->addYear()->toDateString(); // 2017-03-01
Carbon::parse('2016-02-29')->settings(['yearOverflow' => false])->addYear()->toDateString(); // 2017-02-28

まとめ

phpのCarbonの注意を書きました。

知ってないとバグが起きてしまう可能性は大いにあるので抑えておきましょう。
他の言語でも日付の計算は最初に動きを確かめておいたほうが個人的には良いかなと思います。

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

【初心者向け】PHPマスター講座 vol.4(比較演算子を学ぼう)

みなさんこんにちは!けいです

今回は「比較演算子」について解説します!

【PHPマスター講座】演算子とは

===========================

▶︎演算子(えんざんし)とは何か🐼?

ひとつ以上の値 (あるいはプログラミング用語における「式」) から別の値 (制御構造が式になるように) を生み出すもの(引用先:PHPマニュアル)

見てもらうとわかるように…

マニュアルは「これでもか!」ってくらい
簡単な内容を複雑に書く天才なので

今回は演算子の中でも
初心者が一番初めに学んでおくべき

【比較演算子】について
一つずつ丁寧に解説していきます!

※演算子の基本となる「代数演算子」の知識が曖昧な方は上記リンクから別記事を先に読むと理解度を上げていくことができますよ。


▶︎【比較演算子を一言で表すと】🐼

「値同士を比較し、その結果を返す」ですが…

これだとまだイメージがつきにくいので

一つずつ丁寧に解説していきます!

【比較演算子①】
・「>」:より多い
・「<」:【未満】より少ない
・「>=」:【以上】より多いか等しい
・「<=」:【以下】より少ないか等しい

「以上」「以下」「未満」の違いによって

計算で表す内容は大きく変わるので

今回の記事でしっかりと抑えておきましょう!


【比較演算子②】
・「=」:代入
・「==」:等しい
(値が等しい時に「TRUE」を示す)
・「!=」:等しくない
(値が等しくない時に「False」を示す)
・「===」:等しい
(値が等しく型も等しい時に「TRUE」を示す)
・「!==」:等しくない
(値も型も等しくない時に「False」を示す)

※(データ)型
=文字、数値(整数)
=数値(実数=小数点を含む値を指す)
=論理(TrueかFalseか/YesかNoか)

(現時点では【30%くらい】の理解でも大丈夫です。今から補完していきます!)

===========================

▶︎比較演算子を実践で学ぼう🐼(基礎編)

基礎編ではPHP学習者が一番気になる

「==」
「===」

この違いを簡単に解説していきます。

・前提条件
$manga=100
$anime=100

・上記ケースの場合
$manga == $anime
//$mangaと$animenの値(100)が
 どちらも等しいので「TRUE」になります

$manga === $anime
//$mangaと$animenの値(100)は等しいけれども
 データ型が異なるので「FALSE」になります

===========================

💡ポイント💡

・「==」:等しい
(値が等しい時に「TRUE」を示す)

・「===」:等しい
(値が等しく型も等しい時に「TRUE」を示す)

※(データ)型
=文字、数値(整数)
=数値(実数=小数点を含む値を指す)
=論理(TrueかFalseか/YesかNoか、真か偽か)

===========================

▶︎比較演算子を実践で学ぼう🐼(応用編)

さて、ここまでで基礎を学べたと思うので

次は実際に応用編として

「比較演算子」を学びましょう。

①「>=」を使うケース:
【以上】より多いか等しい

<?php
$age = 21;

if($age >= 20){
echo '成人(飲酒ができます)';
} else {
echo '未成年(飲酒はできません)';
}
?>

===========================

▶︎【表示結果】

成人(飲酒ができます)

※今回は「21歳(20歳以上)」なので「TRUE」の成人(飲酒ができます)が表示されます!

===========================

②「==」を使うケース:
等しい(値が等しい時に「TRUE」を示す)

<?php
$login_name = 'けい';

if($login_name == 'けい'){
echo 'ログインに成功しました!';
} else {
echo 'ログイン情報が誤っています。';
}
?>

===========================

▶︎【表示結果】

ログインに成功しました!

※今回は変数名($login_name)の「'けい'」がif文の「==」の内容と同じなので、TRUEの結果が出力されます!

===========================

③「===」を使うケース:
等しい(値が等しく型も等しい時に「TRUE」を示す)

<?php
$age = 21;

if($age === '21'){
echo '年齢は同じです!';
} else {
echo '年齢が違います。';
}
?>

===========================

▶︎【表示結果】
年齢が違います。

※''が入っているので、数字は同じですが
型の表示が異なるので「elseの結果」が出力されます!

===========================

さて、今回のPHPマスター講座 vol4(比較演算子を学ぼう)はここまでとなります!

少しでもあなたのPHP学習のお役に立てれば幸いです😌

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

PHP for文つまずきポイント

はじめに

  • 初心者向けです。お手柔らかに。
  • 昔書いたやつです。下書き溜まっちゃったので出します。

for文

$array = ['りんご','ゴリラ','ラッパ','パンツ'];
for ($i=0; $i < count($array); $i++) { 
    # code...
}

プログラミング始めたばかりの頃によく見たこの書き方、個人的にはよくないと思っている。
なぜなら

$i < count($array)

ここにcount()関数を用いることによって、実行条件の評価時に毎回count()が実行されてしまうからだ。
これがどういうデメリットを産むかというと、

  • 実行条件が評価される度に、関数が実行されるため重くなる。
  • for文の中(ループ中)で$arrayの要素の数が変更された場合、実行条件が変わってしまう

致命的なのはこれ

  • for文の中(ループ中)で配列の数が変更された場合、実行条件が変わってしまう

だろう。例をあげると

$array = ['りんご','ゴリラ','ラッパ','パンツ'];
for ($i=0; $i < count($array); $i++) {
    // いろんな処理
    unset($array[$i]);
}

これは(初心者の僕からしたら)、for文開始時に配列の要素の数が4つあるわけだから4回回って欲しい。
が、for文が一回回るごとに要素の数が減っていくため、それにともなってcount($array)も減っていってしまうのだ。

というわけでこのループは2回しか回らない。
今は書いてて「当たり前だろこれは...」と思うが初期の頃の僕には難しかったので書いておく。

解決策

$array = ['りんご','ゴリラ','ラッパ','パンツ'];
$count = count($array);
for ($i=0; $i < $count; $i++) {
    // いろんな処理
    unset($array[$i]);
}

これなら変数が評価される時点で固定される(COWというすばらしい戦略)ので実行条件は$i < 4で固定される。

使えるならforeachを使おう。配列のためにある言語構造だし。

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

php掲示板のログアウト画面をクッキーを用いて実装したいです。

ログイン状態からログアウトするためにクッキーを用いて実装しているのですが
右も左も分からなくなってしまいました。

ログイン画面までは実装できています。

ログアウト画面に関しても、自分なりにググって、調べてコードを打ち込みましたが全然ダメです;(

どなたか詳しい方、御指導、御鞭撻頂けないでしょうか。

session_start();

if( !empty($_GET['btn_logout']) ) {
    unset($_SESSION['admin_login']);
}
if( !empty($_POST['btn_submit']) ) {
if( !empty($_POST['admin_password']) && $_POST['admin_password'] === PASSWORD ) {
        $_SESSION['admin_login'] = true;
    } else {
        $error_message[] = 'ログインに失敗しました。';
    }
}

setcookie("name", "test");
echo $_COOKIE["name"];
setcookie("name", "test",time()+60*60*24);
//setcookie("name" , "" , time()-100 );
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Chromeでajax処理のデバッグをする

概要

eccube4では商品をカートに入れる際にajax処理を使っているが、エラーになった時に詳細がわからなくて困っていた。

手順

POSTMANを使ったやりかたもあるが、今回はChromeを使った場合の手順。

デベロッパーツールのネットワークタブを選択
Screen Shot 2020-03-31 at 11.50.35.png

この状態でajaxの処理を実行する。
※今回はeccube4の商品詳細のソースなのでjavascriptのリダイレクト処理はコメントアウトなりして無効化しておく必要がある。

//window.location.href = "{{ url('cart') }}";

Nameのところに新しくファイル?が追加されるのでファイルをクリックしてからHeaderのタブを選択する

Screen Shot 2020-03-31 at 12.00.49.png

Formで送信されたデータを知りたい時は下の方にスクロールするとFormDataというのがあるのでそこを見ればいい。

プレビューを選択するとSymfonyでお馴染みのエラー画面が出てくるので、そこを修正していけばおk!
Screen Shot 2020-03-31 at 12.00.49.png

これでajaxのエラーと向き合えるね!!

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

PHP学習記 #2日目

empty関数とisset関数の違い

empty関数は変数または配列がnullのときはTrue(空)を返す。isset関数は変数がnullのときはFalseを返す。要するに配列の要素にNULLが存在するかを調べるときはisset関数、空の要素が存在するかを調べるときはempty関数を利用する。

Web APIとは

APIとは「Application Programming Interface」の略であり、アプリケーション同士を繋ぐものを指している。よって、Web APIとはHTTP通信方式によってネットワークから呼び出すAPIである。

namespaceとは

namaspeceは名前空間であり、通常同じファイルに同じクラスや関数名、定数名は存在することが出来ないが、名前空間によって関連するクラスや、インターフェース、関数、定数などをグループ化することができる。そのため、名前空間を指定しておくことで、作成したクラスが、他のクラスの関数などと名前が衝突することを防ぐことができる。

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

CakePHP3で別々のデータベースのテーブルをjoinする方法

app.phpに接続情報を明記

2つの「datebase_aのcommentsテーブル」と「datebase_bのusersテーブル」が存在するとします。(usersテーブルとcommentsテーブルを別のデータベースで管理するのはあくまで例です)
1つのusersに複数のcommentsが紐づきます。

config/app.phpに接続情報を明記しましょう。

app.php
'Datasources' => [
    'default' => [
        'className' => 'Cake\Database\Connection',
        'driver' => 'Cake\Database\Driver\Mysql',
        'persistent' => false,
        'host' => 'localhost',
        'username' => 'user_a', 
        'password' => 'password',
        'database' => 'database_a',
        'encoding' => 'utf8',
        'timezone' => 'UTC',
        'cacheMetadata' => true,
        'log' => false,
    ],
    'database_b' => [
        'className' => 'Cake\Database\Connection',
        'driver' => 'Cake\Database\Driver\Mysql',
        'persistent' => false,
        'host' => 'localhost',
        'username' => 'user_b', 
        'password' => 'password',
        'database' => 'database_b',
        'encoding' => 'utf8',
        'timezone' => 'UTC',
        'cacheMetadata' => true,
        'log' => false,
    ],
],

モデルに定義

defaultConnectionName()を使いましょう。

UsersTable.php
namespace App\Model\Table;

use Cake\ORM\Query;
use Cake\ORM\RulesChecker;
use Cake\ORM\Table;
use Cake\Validation\Validator;

class EstatesTable extends Table
{
    public static function defaultConnectionName(){
        return 'database_b';
    }

    public function initialize(array $config)
    {
        parent::initialize($config);
        $this->setTable('users');
        $this->setDisplayField('id');
        $this->setPrimaryKey('id');
        $this->addBehavior('Timestamp');
    }
}

別々のデータベースのテーブルをjoin

UsersController.php
$users = $this->Users->find()
    ->join([
        'table' => 'datebase_a.comments',
        'alias' => 'C',
        'type' => 'LEFT',
        'conditions' => 'C.user_id = Users.id',
    ])
    ->toArray();

参考:公式サイト

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

CakePHP3で複数でデータベースに接続する方法

config/app.phpに接続情報を明記しましょう。

app.php
'Datasources' => [
    'default' => [
        'className' => 'Cake\Database\Connection',
        'driver' => 'Cake\Database\Driver\Mysql',
        'persistent' => false,
        'host' => 'localhost',
        'username' => 'user_a', 
        'password' => 'password',
        'database' => 'database_a',
        'encoding' => 'utf8',
        'timezone' => 'UTC',
        'cacheMetadata' => true,
        'log' => false,
    ],
    'database_b' => [
        'className' => 'Cake\Database\Connection',
        'driver' => 'Cake\Database\Driver\Mysql',
        'persistent' => false,
        'host' => 'localhost',
        'username' => 'user_b', 
        'password' => 'password',
        'database' => 'database_b',
        'encoding' => 'utf8',
        'timezone' => 'UTC',
        'cacheMetadata' => true,
        'log' => false,
    ],
],

これでおしまい。

別記事でCakePHP3で別々のデータベースのテーブルをjoinする方法を紹介していますので、気になる方はこちらの記事をご覧ください。

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

LaravelでjQueryを使ってAjax通信する時のURLの書き方は注意!

こんにちは、Web初心者のはるまきです。Qiita初投稿!

LaravelでJavaScriptを記述する時のパスの書き方には少し注意が必要だなと思ったので、メモしておきます。単純な話ですけど:sunny:

ルーターに合わせてパスを書こう!

初心者あるあるだとは思うんですが、「お手本通りやってもうごかな〜い!」。私の場合はjQueryのAjax通信が、それでした。お手本のコードはこんな感じでした。

hoge.js
$.ajax({
  type: "GET",
  url: "some.php", 他にも[../aaa/bbb/ccc.php]とか
}).done(function( msg ) {
  alert( "データ保存: " + msg );
});

htmlでスタイルシートやjsを読み込む時のパスは、「aaa/bbb/ccc.js」のような書き方ですよね。でもphpファイルを読み込む時(?)はどうやら違うようでした。web.phpファイルにあるルートのまま記述すれば、きちんと動きました。jsファイルとルーター(web.php)。

web.php
Route::get('selectedCategoryHoge', 'hogeController@getHogeAnotherhoge');
hoge.js
$(function(){
    $('#hoge').click(function dojQueryAjax() {
        $.ajax({        
            url:'selectedCategoryHoge',
            type:'GET',
        }).done(function(data){
            //省略
        }).fail(function(data){
            //省略
        });
    });
});

URLはルーターさんに従おう!
以上になります。何かご指摘点があれば是非よろしくお願いします!

今回、生まれて初めて、hogeってヤツを使いました。fuga,piyo,foo,barとかも使ってみたい。。
最後まで読んで頂きありがとうございました。

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

【Laravel】リレーションがある場合のファクトリによるテストデータの生成

ファクトリでリレーションがあるモデルのテストデータを生成するパターンをメモしています。
公式リファレンス(データベースのテスト)

親子関係

User(親)->Movie(子)のように、二つのテーブル間の親子関係なら公式リファレンスにある方法で簡単にテストデータを生成できます。each()とモデルのリレーションメソッドを利用します。

factory(App\Models\User::class)
    ->create()
    ->each(function ($user) {
         $user->movies()->save(factory(App\Models\Movie::class)->make());
    });

親子孫関係

User(親)->Movie(子)->Review(孫)のように三つ以上のテーブル間に関係がある場合は上の方法をそのまま使うことはできません。なので外部キーとなる属性をオーバライドしてリレーションを構築します。

factory(App\Models\User::class)->create()->each(function ($user) {
    factory(App\Models\Movie::class)->create(['user_id' => $user->id])->each(function ($movie) {
        factory(App\Models\Review::class)->create(['movie_id' => $movie->id]);
    });
});
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[PHP]paizaスキルチェック用標準入力取得方法のメモ

はじめに

paizaのスキルチェックをしている際に複数の標準入力の取得方法が複数あったのでメモとして残します。

入力値取得方法まとめ

入力値は一律で下記に指定する通りとする

1 23 4

1.fgetsメソッド

$input = fgets(STDIN);
//fgets()はファイルポインタを指定することで文字列を返します。
//STDINを指定することで標準入力を返すようになります。(STDIN:standard inputの略)
var_dump($input);
<<--出力内容-->>
string(7) "1 23 4
"

var_dump()fgets()の返り値を確認してわかる通り、最後の改行も一緒に取得してしまっていることがわかります。

2.trimメソッド

$input = trim(fgets(STDIN));
//trim()は引数のホワイトスペースを取り除くことができます。
var_dump($input);
<<--出力内容-->>
string(6) "1 23 4"

trim()を使用することにより、fgets()で取得した値の改行を取り除くことができました。

3.explodeメソッド

$input = explode(' ', trim(fgets(STDIN)));
//explode()は第2引数の文字列を第1引数で分割し配列に格納します
var_dump($input);
<<--出力内容-->>
array(3) {
  [0]=>
  string(1) "1"
  [1]=>
  string(2) "23"
  [2]=>
  string(1) "4"
}

最後に

今回はpaizaスキルチェックで初めて標準入力というものを知り、ノリで課題をしていたけど頭の中で纏まったのでQiitaでも纏めてみました。

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