日: 2019年12月6日

  • laravelのtinkerを使ってデータを投入する

    laravelのtinkerを使ってデータを投入する

    はじめに

    laravelにはtinkerという機能があり、“` php artisan tinker “` コマンドを用いてデータを入れることができる。

    前提条件

    以下のようなテーブルがあったとする

    CREATE TABLE `users` (
      `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
      `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
      `email` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
      `password` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
      `remember_token` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
      `created_at` timestamp NULL DEFAULT NULL,
      `updated_at` timestamp NULL DEFAULT NULL,
      PRIMARY KEY (`id`),
      UNIQUE KEY `users_email_unique` (`email`)
    ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci

    “` app\User.php “` 配下のModele クラスに、
    ホワイトリスト形式で入力を受付けさせるようにする。

        protected $fillable = [
            'name', 'email', 'password',
        ];

    “` fillable “` で宣言されたカラムがホワイトリストとして機能し、これらのカラムにデータの投入が許可される。

    逆にブラックリスト形式で制御したい場合は “` guarded “` という変数名を利用する 

    データ投入

    tinkerを起動する

    php artisan tinker
    Psy Shell v0.9.11 (PHP 7.2.25 — cli) by Justin Hileman
    >>>

    の画面が出たら、以下の通り投入したいデータを入力

    post = App\User::create(['name'=>'tsukada hoge','email'=>'hoge@sumito.jp','password'=>'cccc']);

    動作確認

    データを確認すると無事投入された

     

    sample

    以下のようにデータを投入する場合は、

    “` app\User.php “` 配下のModele クラスを編集する必要はない。

    $ php artisan tinker
    Psy Shell v0.9.12 (PHP 7.2.25 — cli) by Justin Hileman
    >>> $post = new App\Post();
    => App\Post {#2894}
    >>> $post->title = 'title hogehoge';
    => "title hogehoge"
    >>> $post->body = 'body hogehoge';
    => "body hogehoge"
    >>> $post->save();
    => true
    >>>

    データを確認したい場合

    “` App\Post::all(); “` 

    PostはMODEL名

    >>> App\Post::all();
    => Illuminate\Database\Eloquent\Collection {#2903
         all: [
           App\Post {#2904
             id: 1,
             title: "title 1",
             body: "body 1",
             created_at: "2019-12-09 15:02:27",
             updated_at: "2019-12-09 15:02:27",
           },
           App\Post {#2905
             id: 2,
             title: "hogehoge",
             body: "body hogehoge",
             created_at: "2019-12-09 15:04:21",
             updated_at: "2019-12-09 15:04:21",
           },
         ],
       }
    >>>

    以下のように投入する場合は、エラーが発生する

    >>> App\Post::create(['title'=>'title 2', 'body'=>'body 2']);
    Illuminate/Database/Eloquent/MassAssignmentException with message 'title'
    >>>

    この場合は、“` app\User.php “` 配下のModele クラスを編集することで、投入を許可する。

    ※ “` app\User.php “` を編集した後は、tinkerに入り直す必要がある。

    $ php artisan tinker
    Psy Shell v0.9.12 (PHP 7.2.25 — cli) by Justin Hileman
    >>> App\Post::create(['title'=>'title 2', 'body'=>'body 2']);
    => App\Post {#2892
         title: "title 2",
         body: "body 2",
         updated_at: "2019-12-09 15:11:31",
         created_at: "2019-12-09 15:11:31",
         id: 3,
       }
    >>>

    無事入力できた

    >>> App\Post::all()->toArray();
    => [
         [
           "id" => 1,
           "title" => "title 1",
           "body" => "body 1",
           "created_at" => "2019-12-09 15:02:27",
           "updated_at" => "2019-12-09 15:02:27",
         ],
         [
           "id" => 2,
           "title" => "hogehoge",
           "body" => "body hogehoge",
           "created_at" => "2019-12-09 15:04:21",
           "updated_at" => "2019-12-09 15:04:21",
         ],
         [
           "id" => 3,
           "title" => "title 2",
           "body" => "body 2",
           "created_at" => "2019-12-09 15:11:31",
           "updated_at" => "2019-12-09 15:11:31",
         ],
       ]
    >>>

    条件付きのデータ取得

    x件目のデータを取得

    >>> App\Post::find(3)->toArray();
    => [
         "id" => 3,
         "title" => "title 2",
         "body" => "body 2",
         "created_at" => "2019-12-09 15:11:31",
         "updated_at" => "2019-12-09 15:11:31",
       ]
    >>>

    whereを使ったデータ取得

    >>> App\Post::where('id', '>', 2)->get()->toArray();
    => [
         [
           "id" => 3,
           "title" => "title 2",
           "body" => "body 2",
           "created_at" => "2019-12-09 15:11:31",
           "updated_at" => "2019-12-09 15:11:31",
         ],
       ]
    >>>

    orderByを用いた並び替え

    >>> App\Post::where('id', '>' , '1')->orderBy('created_at', 'desc')->get()->toArray();
    => [
         [
           "id" => 3,
           "title" => "title 2",
           "body" => "body 2",
           "created_at" => "2019-12-09 15:11:31",
           "updated_at" => "2019-12-09 15:11:31",
         ],
         [
           "id" => 2,
           "title" => "hogehoge",
           "body" => "body hogehoge",
           "created_at" => "2019-12-09 15:04:21",
           "updated_at" => "2019-12-09 15:04:21",
         ],
       ]
    >>>

    SQLのlimit

    >>> App\Post::where('id', '>' , '1')->get()->take(1)->toArray();
    => [
         [
           "id" => 2,
           "title" => "hogehoge",
           "body" => "body hogehoge",
           "created_at" => "2019-12-09 15:04:21",
           "updated_at" => "2019-12-09 15:04:21",
         ],
       ]
    >>>

     

     

    laravel の実践向け書籍

  • Firebase AuthenticationにFacebook Accountでログインする

    Firebase AuthenticationにFacebook Accountでログインする

    はじめに

    Firebase AuthenticationにFacebook Accountでログインを有効にさせる方法をまとめます。

    設定

    Facebook for Developers(以下Facebook)にログインして、アカウントのセットアップをします

    https://developers.facebook.com/?locale=ja_JP

     

    Firebaseのログインプロバイダの画面で「Facebookログイン」を有効にします。

    Facebook側のページに戻り、左側の設定のからベーシックを押し、アプリID/app secretを確認します。

    Firebase側に戻り、それぞれ埋めます。

    Facebookでクイックスタートからウェブを選択します。

    WebアプリケーションのURLを入力。

    Firebaseの画面に表示されているOAuth リダイレクト URI を Facebook アプリの設定に追加します。

    以上で設定は完了です。

    Signin

    自作のアプリケーションからSigninします

    Facebookログインを試みると、

    よく見るFacebookの承認画面が表示され、ログインを押すと、無事アプリケーションにログインできるようになりました。

    注意すべきところ

    接続元の環境がhttp

    ローカルで開発しているので、http://localhost/ で確認していたのですが、httpでFacebookログインを試みると

    Facebook側で以下のようなアラートが出て、invalid_request

    無視して進めたところ認証エラーが。

    Error getting verification code from facebook.com response: error=invalid_request&error_code=191&error_description

    というエラーが表示されるようになりました。

    その対策としてFirebase Hostingへdeployして、httpsで接続できるようにした上でFacebookとの接続をするようにしました。

    メールアドレスの重複

    既に他のソーシャルアカウントでログインした後に、Facebookアカウントでログインを試みるとエラーが。。

    An account already exists with the same email address but different sign-in credentialsSign in using a provider associated with this email address

    どうやらFirebaseのデフォルトの動きとしてソーシャルアカウントに登録したメールアドレスが、他のソーシャルアカウントで使っている場合、「既に登録してある」と見なされアカウント作成できないようです。

    もちろんFirebaseで承認したアカウントを削除することで、Facebookアカウントでログインできるようになりました。

     

    しかし、やはりユーザーによっては複数ソーシャルアカウントが同一メールアドレスで登録している人も少なくありません。

    設定変更画面から複数メールアドレスの登録を許可させることができます。

    デフォルトでは上段が選択されていますが、下の「複数のアカウントを作成できるようにする」を選択します。

    Google認証に加え、Facebookアカウントでもログインできるようになりました。
    登録アカウントは以下の通り。

    Firebaseはシンプルな認証機能を提供してくれるので、これからアプリケーションを作っていくという場合は最適な選択肢になるのではないでしょうか。