あじちゃんの備忘録。

〜ここはメモ帳です

マイグレーションファイルの作成でエラー

  • 以下のファイルを実行
//@migrationファイル
public function up()
{
    if (!Schema::hasTable('Test')) {
        Schema::create('Test', function(Blueprint $table)
        {
            $table->engine = "InnoDB";
            $table->bigInteger('empId', 20)->unsigned()->comment('従業員ID');   //BIGINT(20) UNSIGNED PRIMARY KEY NOT NULL
            $table->bigInteger('compId', 20)->unsigned()->comment('会社ID');    //BIGINT(20) UNSIGNED
        });
    }
}
  • auto columnは設定していないのに以下のエラーが発生する.
SQLSTATE[42000]: Syntax error or access violation: 1075 Incorrect table definition; there can be only one auto column and it must be defined as a key 


  • こうするとうまくいく. 😕💭カラム長の指定がまずいの???
Schema::create('Test', function(Blueprint $table)
{
    $table->engine = "InnoDB";
    $table->bigInteger('empId', 20)->unsigned()->comment('従業員ID');   //BIGINT(20) UNSIGNED PRIMARY KEY NOT NULL
    $table->bigInteger('compId')->unsigned()->comment('会社ID');        //BIGINT(20) UNSIGNED
});
mysql> show columns from Test;
+-----------------------------+---------------------+------+-----+---------+----------------+
| Field                       | Type                | Null | Key | Default | Extra          |
+-----------------------------+---------------------+------+-----+---------+----------------+
| empId                       | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
| compId                      | bigint(20) unsigned | NO   |     | NULL    |                |
+-----------------------------+---------------------+------+-----+---------+----------------+

🙁💭 目的は達成できたけど原因がわからずもにょる.

BIGINTは8バイト整数なので、必要記憶容量は8バイト.
桁数はマイナスを含め20桁なので、上記では自動で最大が振られたということ...?
他のファイル見ててもそんな感じだった. 目的のサイズが最大より小さくなるなら指定する感じかな?

⚠️ BIGINT(20)の20は表示幅のこと. 桁数ではない. TINYINT(1)で格納可能値の勘違いをしていた件


てか、指定していないのに[empId]が勝手にprimary keyになってるしauto_incrementになってる...
$table->primary('empId'); を指定していたところエラー( SQLSTATE[42000]: Syntax error or access violation: 1068 Multiple primary key defined )となったため外していた.
unsigndBigIntegerの場合だとprimaryもauto_incrementも自動付与はされず、自分で指定する必要があった.
指定の仕方で型は同じでも付属するオプションが違うようです...(難しい)

// [primary key][auto_increment] [tyep = "bigint(20) unsigned"]
$table-> unsigned bigInteger('Id');

// [tyep = "bigint(20) unsigned"]
$table->bigInteger('Id')->unsigned();

まとめ

😭 むずかしい!
(もはやまとめたくない. 今日は悪い子になる.) 後で読む→Laravel 5.3 Eloquent ORM 入門 2 (マイグレーション)

トランザクション処理で詰まった

結論

トランザクション処理では外部で定義したの変数は指定して呼び出す必要がある.

詳細

ざっくり以下のような状態で実行すると...

$kinds = ['cat','dog','mouse'];

DB::transaction(function (){
    //格納データ配列の作成
    $data = [];
    foreach($kinds as $kind){
        array_push($data,[
            'kind'=>$kind,
            'createdAt'=>date('Y-m-d H:i:s'),
        ]);
    }

    //登録処理
    DB::insert($data);
});

このようなエラーメッセージが表示される.

//ERROR MESSAGE
Undefined variable: kind

引数の呼び出しが必要だったようで、以下のようにして解決。

$kinds = ['cat','dog','mouse'];

DB::transaction(function () use ($kind) {
    //...同処理...
}

🙁💭 このtransactionがメソッドでスコープが限定されてるものだってことを知らなかったせいで嵌ってしまった。基礎を知るis大切。一晩きちんと寝たら気づいたのでよかった。

参考

連想配列が格納された配列

$input   =   ('id'       => '52738495'
             'name'     => 'ねこ'
             'birthday' => '2000/01/31');

↑みたいな連想配列を作りたい。

  • できた
$values = array(100,200,300,400,500);

$data = [];  //全体の配列

foreach($values as $value) {
    $item = array('id'=>$value, 'name'=>'ねこ','birthday'=>'2000/01/31');
    array_push($data,$item);
}
echo "<pre>";
print_r($data);
echo "</pre>";
//出力
Array
(
    [0] => Array
        (
            [id] => 100
            [name] => ねこ
            [birthday] => 2000/01/31
        )

    [1] => Array
        (
            [id] => 200
            [name] => ねこ
            [birthday] => 2000/01/31
        )

    [2] => Array
        (
            [id] => 300
            [name] => ねこ
            [birthday] => 2000/01/31
        )

    [3] => Array
        (
            [id] => 400
            [name] => ねこ
            [birthday] => 2000/01/31
        )

    [4] => Array
        (
            [id] => 500
            [name] => ねこ
            [birthday] => 2000/01/31
        )

)