Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

DDC-966: SchemaTool does not check for inherited fields in STI sub-classes and overwrites their column definitions to DEFAULT NULL #5501

Closed
doctrinebot opened this issue Jan 1, 2011 · 3 comments
Assignees
Labels
Milestone

Comments

@doctrinebot
Copy link

Jira issue originally created by user ayhan:

/****
 * @Entity
 * @Table(
 *     name="eav_attribute",
 *     uniqueConstraints={
 *         @UniqueConstraint(columns={"core*project*id", "name"})
 *     }
 * )
 * @InheritanceType(
 *     "SINGLE_TABLE"
 * )
 * @DiscriminatorColumn(
 *     name="datatype",
 *     type="string"
 * )
 * @DiscriminatorMap({
 *     "datetime"="AttributeDatetime",
 *     "decimal"="AttributeDecimal",
 *     "int"="AttributeInt",
 *     "string"="AttributeString",
 *     "text"="AttributeText"
 * })
 */
abstract class AbstractAttribute
{
    // ...

    /****
     * @Column(type="string")
     */
    protected $name;

    /****
     * @Column(type="boolean")
     */
    protected $is_unique;

    // ...
}

/****
 * @Entity
 */
class AttributeDatetime extends AbstractAttribute
{
}

Expected SQL-dump:

name VARCHAR(255) NOT NULL,
is_unique TINYINT(1) NOT NULL,

SQL-dump created by SchemaTool:

name VARCHAR(255) DEFAULT NULL,
is_unique TINYINT(1) DEFAULT NULL,

This behaviour is problematic, especially for columns which are part of a unique constraint.

Reason:

SchemaTool doesn't really check for inherited fields in STI sub classes in method getSchemaFromMetadata() and passes all fields (incl. the inherited) to method _gatherColumn() where finally the column definition of the parent class will be overwritten.

private function _gatherColumn($class, array $mapping, $table)
{
    // Lines 309 - 311
    if ($class->isInheritanceTypeSingleTable() && count($class->parentClasses) > 0) {
        $options['notnull'] = false;
    }
}

A quick fix:

Change that if-clause above to

if ($class->isInheritanceTypeSingleTable() && count($class->parentClasses) > 0 && ! isset($mapping['inherited'])) {

Better fix:

Only pass not inherited fields to the _gatherColumn() method, as done with CTI sub classes.

@doctrinebot
Copy link
Author

Comment created by @beberlei:

Fixed

@doctrinebot
Copy link
Author

Issue was closed with resolution "Fixed"

@doctrinebot
Copy link
Author

Comment created by ayhan:

Wow, that was fast!

@doctrinebot doctrinebot added this to the 2.0.1 milestone Dec 6, 2015
@doctrinebot doctrinebot added the Bug label Dec 7, 2015
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants