Проверьте, существует ли уже УНИКАЛЬНАЯ строка, используя findBy в ManyToMany, какой-нибудь обходной путь или рабочее решение?

0

Таким образом, у меня есть отношения, определенные в моих сущностях:

class Producto
{
    /**
     * @ORM\ManyToMany(targetEntity="AppBundle\Entity\Norma", inversedBy="normasProducto", cascade={"persist"})
     * @ORM\JoinTable(name="nomencladores.norma_producto", schema="nomencladores",
     *      joinColumns={@ORM\JoinColumn(name="producto_id", referencedColumnName="id")},
     *      inverseJoinColumns={@ORM\JoinColumn(name="norma_id", referencedColumnName="id")}
     * )
     */
    protected $productoNormas;

} 


class Norma
{
    /**
     * @ORM\ManyToMany(targetEntity="AppBundle\Entity\Producto", mappedBy="productoNormas", cascade={"persist"})
     */
    protected $normasProducto;
}

И я пытаюсь проверить, если данная пара producto_id - norma_id уже существует не пытаться вставить его еще раз, и я делаю следующим образом:

$exists = $em->getRepository('AppBundle:Producto')->findOneByProductoNormas($productoId);

if ($exists) {
    $status = 400;
} else {
    try {
        $producto->addProductoNormas($normaEntity);
        $em->flush();
        $response['success'] = true;
    } catch (Exception $ex) {
        $status = 400;
        $response['error'] = $ex->getMessage();
    }
}

Но я получаю эту ошибку:

Примечание. Неопределенный индекс: joinColumns в строке /var/www/html/project.dev/vendor/doctrine/orm/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php 1665

Проводя исследование в Google и здесь, на SO, я обнаружил, что это может быть ошибкой здесь или, возможно, нет, и мы (я и другие, которые сообщают об этой проблеме) делают что-то неправильно. Я не могу найти, где проблема или проблема, поэтому любой совет или помощь будут хороши для меня и для других. Единственная идея, которую я имею в виду, это создать представление в СУРБД, а затем создать объект для его чтения и проверить, существует ли запись, у меня нет ничего, кроме этого, каких-либо идей? Помогите? Рабочий пример кода?

Теги:
many-to-many
doctrine
doctrine2

2 ответа

0
Лучший ответ

На самом деле вы можете использовать службу "database_connection", чтобы проверить, существует ли такая строка:

$this->get('database_connection')
     ->fetchColumn('select count(id) as cnt 
                    from <norma_producto_table> 
                    where producto_id = ? and 
                          norma_id = ?', array($producto_id, $norma_id));

Это действительно проще, чем пытаться справиться с этим с помощью многих или многих методов отношений. Я бы сделал это, если бы мне пришлось делать то, что вам нужно (и на самом деле я это делаю).

  • 0
    Это работает для меня, спасибо
  • 0
    Не за что. Наслаждайтесь!
Показать ещё 2 комментария
0

Я не знаю окончательного ответа, но у меня была такая же проблема, и это как-то связано с аннотациями моих объектов, которые не могут точно сказать вам, что.

Вот рабочий пример с фотографиями и альбомами

class Photo
    {
         /**
         * @ORM\ManyToMany(targetEntity="Acme\MyBundle\Entity\Album", inversedBy="photos")
         * @ORM\JoinColumn(nullable=true)
        */
        private $albums;

class Album
    {
        /**
         * @ORM\ManyToMany(targetEntity="Acme\MyBundle\Entity\Photo", mappedBy="albums")
         * @ORM\JoinColumn(nullable=true)
        */
        private $photos;

Чтобы проверить существование, которое вы могли бы сделать, скажем, вы ищете фотографию idPic

$photo = $repository ... ->findOneBy($idPic)
if($photo->getAlbums()->contains($album))
  • 0
    Это решение не работает для меня, все еще может добавлять те же записи и, следовательно, продолжать получать ту же ошибку, связанную с дубликатами. Unique violation: 7 ERROR: duplicate key value violates unique constraint "norma_producto_pkey"
  • 1
    Это правильное решение. Но contains не ищет идентификаторы, но для самого элемента. Так и должно быть ->contains($album) !
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню