Может ли таблица иметь несколько слизней в Doctrine? - PullRequest
1 голос
/ 25 марта 2010

Можно ли иметь несколько слизней на одном столе в Doctrine?

Я попробовал это в моем yaml-файле:

Article:
  tableName: tst_article
  actAs:
     Sluggable:
       unique: true
       fields: [title]
       canUpdate: true
     Sluggable:
       unique: true
       fields: [text]
       name: secondSlug
  columns:
    id:
      type: integer(8)
      primary: true
      autoincrement: true
    category_id:
      type: integer(8)
    title:
      type: text(255)
    text:
      type: clob

Но после генерации sql был сгенерирован только secondSlug ...

Ответы [ 3 ]

5 голосов
/ 26 марта 2010

Это возможно. В определении вашей таблицы напишите:

public function setUp() {
    parent::setUp();

    $sluggable0 = new Doctrine_Template_Sluggable(array(
        'fields' => array(0 => 'name'),
        'unique' => true,
        'canUpdate' => true
    ));
    $this->actAs($sluggable0);

    $sluggable1 = new Doctrine_Template_Sluggable(array(
        'fields' => array(0 => 'native_name'),
        'unique' => false,
        'canUpdate' => false,
        'name' => 'native_name_slug'
    ));
    $this->actAs($sluggable1);
}

Проблема в самом YAML. У вас есть что-то вроде этого:

keyA:
  keyB: value
  keyB: value

Что можно перевести на:

array(
    'keyA' => array(
        'keyB' => 'value',
        'keyB' => 'value'
    )
);

Итак, как вы видите, есть определение keyB, а затем keyB перезаписывается новым значением. Итак, в вашем файле YAML второе определение заменяет первое.

Как это решить? Я не знаю, но я сделаю некоторые исследования. Сейчас вы вынуждены объявить свои модели на чистом PHP.

0 голосов
/ 26 апреля 2014

Хотя смена библиотек не рекомендуется, иногда это неизбежное зло.Очень небольшое изменение позволяет вам объявить Sluggable_1, Sluggable_2 и т. Д. В вашем YAML.

--- a/lib/vendor/doctrine/Doctrine/Import/Builder.php
+++ b/lib/vendor/doctrine/Doctrine/Import/Builder.php
@@ -711,8 +711,10 @@ class Doctrine_Import_Builder extends Doctrine_Builder
     {
         // find class matching $name
         $classname = $name;
-        if (class_exists("Doctrine_Template_$name", true)) {
-            $classname = "Doctrine_Template_$name";
+        // HACK to allow multiple Sluggables
+        $classname = preg_replace('/_[0-9]+$/', '', $classname);
+        if (class_exists("Doctrine_Template_$classname", true)) {
+            $classname = "Doctrine_Template_$classname";
         }
         return "        \$" . strtolower($name) . "$level = new $classname($option);". PHP_EOL;
     }
0 голосов
/ 12 июня 2010
Article:
  tableName: tst_article
  actAs:
     Sluggable:
       unique: true
       fields: [title, text]
       canUpdate: true
  columns:
    id:
      type: integer(8)
      primary: true
      autoincrement: true
    category_id:
      type: integer(8)
    title:
      type: text(255)
    text:
      type: clob
...