Laravelでjobsテーブルを別の名前に変更するには

バージョン

  • Laravel 6

問題

Laravelのキュードライバーにデータベースを使用する場合、初期状態ではjobsテーブルが使用される。
事情によりjobsテーブルが使用できないため、別の名前にしたい。

対策

config/queue.phpファイルを編集して、テーブル名を変更する。

    'connections' => [

        'database' => [
            'driver' => 'database',
//            'table' => 'jobs',
            'table' => 'new_jobs', //追加
            'queue' => 'default',
            'retry_after' => 90,
        ],

LaravelでwhereInの引数の配列が大きいと動作しない

LaravelのEloquentを使っていて、whereInの引数の配列が大きいとき、クエリーは正しく動作しない。

$array = ['1', '2', ..., '1500'];
$query = Customer::whereIn('id', $array)->get();

Eloquentは内部でPDO::prepare()を使っている。
PDO::prepare()はIN()句の最適化を行うが、データベースがMySQL・MariaDBのとき、配列のサイズがin_predicate_conversion_threshold(デフォルト値は1000)を超えるとエラーが発生するとのこと。

参考

PHPでJSON文字列を整形する

PHPでJSON文字列を整形する方法です。

json_encode関数は、2番目の引数にJSON_PRETTY_PRINTを指定すると、返される結果の書式を、スペースを使って整えます。

参考

JSON文字列を用意します。

$json = '{"browsers": {"firefox": {"name": "Firefox","pref_url": "about:config","releases": {"1": {"release_date": "2004-11-09","status": "retired","engine": "Gecko","engine_version": "1.7"}}}}}';

JSON文字列をjson_decode関数でデコードし、json_encode関数でエンコードすると、整形された文字列を取得できます。

json_encode(json_decode($json), JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
>>> $json = '{"browsers": {"firefox": {"name": "Firefox","pref_url": "about:config","releases": {"1": {"release_date": "2004-11-09","status": "retired","engine": "Gecko","engine_version": "1.7"}}}}}';
=> "{"browsers": {"firefox": {"name": "Firefox","pref_url": "about:config","releases": {"1": {"release_date": "2004-11-09","status": "retired","engine": "Gecko","engine_version": "1.7"}}}}}"
>>> json_encode(json_decode($json), JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
=> """
   {\n
       "browsers": {\n
           "firefox": {\n
               "name": "Firefox",\n
               "pref_url": "about:config",\n
               "releases": {\n
                   "1": {\n
                       "release_date": "2004-11-09",\n
                       "status": "retired",\n
                       "engine": "Gecko",\n
                       "engine_version": "1.7"\n
                   }\n
               }\n
           }\n
       }\n
   }
   """
>>> 

setTimeoutで実行した関数でthisを使う

以下のクラスCのメソッドfでは、setTimeoutでメソッドmを実行する。
このときメソッドmのthisはクラスCではないため、undefinedを出力する。

メソッドmでnameフィールドの値を表示するにはどうすればいいか。

class C {
  constructor() { this.name = 'class C'; }
  f() { setTimeout(this.m, 100); }
  m() { console.log(this.name); }
}
(new C).f(); //=> undefined

アロー関数を使う

アロー関数を使えばthisが変わらない。

class D {
  constructor() { this.name = 'class D'; }
  f() { setTimeout(() => { this.m(); }, 100); }
  m() { console.log(this.name); }
}
(new D).f(); //=> class D

setTimeoutの引数にthisを渡す方法

メソッドmに引数でthisを渡す。

class E {
  constructor() { this.name = 'class E'; }
  f() { setTimeout(this.m, 100, this); }
  m(self) { console.log(self.name); }
}
(new E).f(); //=> class E

bindメソッドを使う方法

bindメソッドでthisを指定する。

class F {
  constructor() { this.name = 'class F'; }
  f() { setTimeout(this.m.bind(this), 100); }
  m() { console.log(this.name); }
}
(new F).f(); //=> class F