在schema.yml中设置Doctrine_Collection键映射属性

6 doctrine symfony1 symfony-1.4 doctrine-1.2 schema.yml

在Doctrine 1.2中,可以为表设置键映射,其中Doctrine_Collection由该表创建的对象将填充集合中每个记录中特定列的键.

上面链接的文档中的示例:

您可能希望映射名称列:

// test.php

// ...
$userTable = Doctrine_Core::getTable('User');

$userTable->setAttribute(Doctrine_Core::ATTR_COLL_KEY, 'username');
Run Code Online (Sandbox Code Playgroud)

现在,用户集合将使用name列的值作为元素索引:

// test.php

// ...
$users = $userTable->findAll();

foreach($users as $username => $user) {
    echo $username . ' - ' . $user->created_at . "\n";
}
Run Code Online (Sandbox Code Playgroud)

有没有办法在schema.yml文件中设置它?

小智 5

在探索类似问题时,我遇到了这个例子:

---
User:
  columns:
    ...
  attributes:
    export: all
    validate: true
Run Code Online (Sandbox Code Playgroud)

coll_key属性应用相同的原则会产生以下结果:

User:
  columns:
    ...
  attributes:
    coll_key: username
Run Code Online (Sandbox Code Playgroud)

我们可以在构建之后验证属性是否被接受:

$this->setAttribute(Doctrine_Core::ATTR_COLL_KEY, 'username');
Run Code Online (Sandbox Code Playgroud)

但有一点需要注意.您必须显式创建要使用的列,否则Doctrine将在构建过程中抛出错误:

User:
  actAs:
    Sluggable:  ~
  columns:
    ...
  attributes:
    coll_key:  slug
Run Code Online (Sandbox Code Playgroud)
$ symfony doctrine:build --all --no-confirmation
>> doctrine  Dropping "doctrine" database
>> doctrine  Creating "dev" environment "doctrine" database
>> doctrine  generating model classes
>> file+     /tmp/doctrine_schema_60681.yml
   ...
>> doctrine  generating form classes

  Couldn't set collection key attribute. No such field 'slug'.

要使上述工作正常,您需要显式指定slug列,即使Sluggable模板通常会自动为您创建它:

User:
  actAs:
    Sluggable:  ~
  columns:
    ...
    slug:
      type:    string(50)
      unique:  true
  attributes:
    coll_key:  slug
Run Code Online (Sandbox Code Playgroud)