В Symfony, как мне перевести связанное поле (внешний ключ) в сущности? - PullRequest
0 голосов
/ 03 октября 2018

У меня есть Событие , содержащее галерею locale должно быть несколько галерей.Я применил здесь ту же самую переводимую аннотацию из моей title string:

 use Gedmo\Mapping\Annotation as Gedmo;
 use Sonata\TranslationBundle\Model\Gedmo\TranslatableInterface;
 use Sonata\TranslationBundle\Traits\Gedmo\PersonalTranslatableTrait;    

 /** other codes hidden for brevity **/

/**
* @ORM\Entity(repositoryClass="App\Repository\EventRepository")
* @ORM\Table(name="events")
* @Gedmo\TranslationEntity(class="App\Entity\Translation\EventTranslation")
*/
class Event implements TranslatableInterface {
   use PersonalTranslatableTrait;

   /** other fields hidden for brevity **/

   /**
    * @var Gallery $gallery
    *
    * @ORM\ManyToOne(targetEntity="App\Sonata\MediaBundle\Entity\Gallery", cascade={"persist"})
    * @ORM\JoinColumns({
    *     @ORM\JoinColumn(name="gallery_id", referencedColumnName="id", onDelete = "SET NULL")
    * })
    * 
    * @Gedmo\Translatable()
    */
   private $gallery;

Но при обновлении я получаю:

InvalidMappingException Невозможно найти переводимый [галерея] как сопоставленное свойство в объекте - App \ Entity \ Event

Кстати, строка заголовка и другие переводимые строки работали правильно (т.е.записи создаются в таблицах event_translations без ошибок)

Так, например, локаль по умолчанию (en) и другие локали (ph, wb)

Мой ожидаемый результат примерно такой:

table: event
----------------------------------
id  |   title       |   gallery_id
23  |   my event    |   451
----------------------------------

table: event_translations
----------------------------------------------------------------------------
id  |locale |object_class       |field      |foreign_key    |content
1   |ph     |App\Entity\Event   |title      |23             |aking piyesta
2   |ph     |App\Entity\Event   |gallery    |23             |452
3   |wb     |App\Entity\Event   |gallery    |23             |453
----------------------------------------------------------------------------

Строка перевода заголовка уже верна.Я просто хочу, чтобы та же логика применялась и к галерее.

1 Ответ

0 голосов
/ 04 октября 2018

Я думаю, что должно работать следующее.

Класс перевода должен выглядеть примерно так:

/**
 * @ORM\Entity
 * @ORM\Table(name="event_translation")
 */
class EventTranslation extends AbstractPersonalTranslation
{
    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Event", inversedBy="translations")
     * @ORM\JoinColumn(name="object_id", referencedColumnName="id", onDelete="CASCADE")
     */
    private $object;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Gallery")
     * @ORM\JoinColumn(name="gallery_id", referencedColumnName="id")
     */
    private $gallery;
}

, а класс Event будет:

/**
* @ORM\Entity(repositoryClass="App\Repository\EventRepository")
* @ORM\Table(name="events")
* @Gedmo\TranslationEntity(class="App\Entity\Translation\EventTranslation")
*/
class OrderEntity implements TranslatableInterface
{
    use PersonalTranslatableTrait;

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\Translation\EventTranslation", mappedBy="object", cascade={"persist"})
     * @Gedmo\Translatable()
     */
    private $translations;

    // ...

}

, поэтомучто галерея является полем EventTranslation, а не полем Event напрямую.

Дайте мне знать, как это происходит.

...