LoginSignup
1
1

More than 5 years have passed since last update.

FOSUserBundleで作られるuserテーブルのスキーマが思ってたんとちがう場合に確認すること

Posted at

Symfony2で何も考えずFOSUserBundleをインストールした場合、生成されるUserテーブルのスキーマが思ってたんと違ってハマったのでメモ

環境
PHP7.0.5
Symfony2.8
PostgreSQL9.5


$ composer require friendsofsymfony/user-bundle

上記でインストールしてEntity/User.php作成して
User.phpを作成しようと以下のコマンドを実行

$ php app/console doctrine:schema:update --dump-sql
CREATE SEQUENCE user_id_seq INCREMENT BY 1 MINVALUE 1 START 1;
CREATE TABLE "user" (id INT NOT NULL, PRIMARY KEY(id));

圧倒的に生成されるカラムが足りない...

原因

composer require時にバージョンを指定しなかったため、1.3.6がインストールされており、
その場合はEntity/User.phpのFOSUserBundleからのuseを以下のようにする必要がある。

<?php

namespace Hoge\FugaBundle\Entity;

//use FOS\UserBundle\Model\User as BaseUser;    // ★こうではなく
use FOS\UserBundle\Entity\User as BaseUser;     // ★こうする
use Doctrine\ORM\Mapping as ORM;

そして以下のコマンドを実行

$ php app/console doctrine:schema:update --dump-sql
CREATE SEQUENCE user_id_seq INCREMENT BY 1 MINVALUE 1 START 1;
CREATE TABLE "user" (id INT NOT NULL, username VARCHAR(255) NOT NULL, username_canonical VARCHAR(255) NOT NULL, email VARCHAR(255) NOT NULL, email_canonical VARCHAR(255) NOT NULL, enabled BOOLEAN NOT NULL, salt VARCHAR(255) NOT NULL, password VARCHAR(255) NOT NULL, last_login TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, locked BOOLEAN NOT NULL, expired BOOLEAN NOT NULL, expires_at TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, confirmation_token VARCHAR(255) DEFAULT NULL, password_requested_at TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, roles TEXT NOT NULL, credentials_expired BOOLEAN NOT NULL, credentials_expire_at TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, PRIMARY KEY(id));
CREATE UNIQUE INDEX UNIQ_8D93D64992FC23A8 ON "user" (username_canonical);
CREATE UNIQUE INDEX UNIQ_8D93D649A0D96FBF ON "user" (email_canonical);
COMMENT ON COLUMN "user".roles IS '(DC2Type:array)';

正しくできました。

注意

ちゃんとFOSUserBundleのインストールマニュアルを読んでみると
composer require時には以下のようにバージョンを指定している

$ composer require friendsofsymfony/user-bundle "~2.0@dev"

上記でインストールし、Entity/User.phpをマニュアルどおり

<?php

namespace Hoge\FugaBundle\Entity;

use FOS\UserBundle\Model\User as BaseUser;    // ★マニュアルどおり
use Doctrine\ORM\Mapping as ORM;

にしたところ

$ php app/console doctrine:schema:update --dump-sql
CREATE SEQUENCE user_id_seq INCREMENT BY 1 MINVALUE 1 START 1;
CREATE TABLE "user" (id INT NOT NULL, username VARCHAR(255) NOT NULL, username_canonical VARCHAR(255) NOT NULL, email VARCHAR(255) NOT NULL, email_canonical VARCHAR(255) NOT NULL, enabled BOOLEAN NOT NULL, salt VARCHAR(255) NOT NULL, password VARCHAR(255) NOT NULL, last_login TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, locked BOOLEAN NOT NULL, expired BOOLEAN NOT NULL, expires_at TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, confirmation_token VARCHAR(255) DEFAULT NULL, password_requested_at TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, roles TEXT NOT NULL, credentials_expired BOOLEAN NOT NULL, credentials_expire_at TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, PRIMARY KEY(id));
CREATE UNIQUE INDEX UNIQ_8D93D64992FC23A8 ON "user" (username_canonical);
CREATE UNIQUE INDEX UNIQ_8D93D649A0D96FBF ON "user" (email_canonical);
COMMENT ON COLUMN "user".roles IS '(DC2Type:array)';

で正しくできました。

結論

つまりちゃんとマニュアルどおりやればハマらなくてすんだんや...

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1