Настройка атрибута сопоставления ключей Doctrine_Collection в schema.yml - PullRequest
6 голосов
/ 20 августа 2011

В Doctrine 1.2 можно настроить Key Mapping для таблицы, где Doctrine_Collection объекты, созданные этой таблицей, будут заполнять ключи из определенного столбца в каждой записи в коллекции.

Пример из документации, указанной выше:

Вы можете отобразить столбец с именем:

// test.php

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

$userTable->setAttribute(Doctrine_Core::ATTR_COLL_KEY, 'username');

Теперь пользовательские коллекции будут использовать значения столбца name в качестве индексов элементов:

// test.php

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

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

Есть ли способ настроить это в файле schema.yml?

Ответы [ 2 ]

5 голосов
/ 21 августа 2011

При изучении аналогичной проблемы я наткнулся на этот пример :

---
User:
  columns:
    ...
  attributes:
    export: all
    validate: true

Применение того же принципа с атрибутом coll_key дает следующее:

User:
  columns:
    ...
  attributes:
    coll_key: username

После сборки мы можем проверить, что атрибут был принят:

$this->setAttribute(Doctrine_Core::ATTR_COLL_KEY, 'username');

Однако есть одна оговорка. Вы должны явно создать столбец, который хотите использовать, иначе Doctrine выдаст ошибку во время процесса сборки:

User:
  actAs:
    Sluggable:  ~
  columns:
    ...
  attributes:
    coll_key:  slug
$ 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
0 голосов
/ 21 августа 2011

Если это возможно, это плохо документировано. Вы можете указать параметры для таблицы в определении таблицы, как это Зная, что

const ATTR_COLL_KEY             = 108;

Я бы попробовал:

User:
  options:
    attr_coll_key: username

тогда

User:
  options:
    attrCollKey: username

или даже

User:
  options:
    108: username

Я не смог точно определить, где в коде обрабатываются параметры, но вы могли бы сделать это с помощью пошаговой отладки xdebug.

Удачи, и скажите использовать, если одна из этих попыток сработает.

...