Отношение Doctrine n:m Неопределенный индекс: joinColumns в BasicEntityPersister.php

Мой вопрос сильно связан с этим Неопределенный индекс: inverseJoinColumns при попытке для определения отношения ManyToMany между двумя объектами

Я пытаюсь найти все книги, в которых нет раздела. ->findBy(массив("раздел"=>null)

Вот моя конфигурация Entity: EditedBooks

    /**
 * @var \Doctrine\Common\Collections\Collection
 *
 * @ORM\ManyToMany(targetEntity="Sections", inversedBy="editedBook")
 * @ORM\JoinTable(name="edited_book_has_section",
 *   joinColumns={
 *     @ORM\JoinColumn(name="edited_book_id", referencedColumnName="id")
 *   },
 *   inverseJoinColumns={
 *     @ORM\JoinColumn(name="section_id", referencedColumnName="id")
 *   }
 * )
 */ 
private $section;

Вот моя конфигурация Entity: Sections

/**
 * Bidirectional (INVERSE SIDE)
 *
 * @ORM\ManyToMany(targetEntity="EditedBooks", mappedBy="section")
 */       
private $editedBook;

Ошибка, которую я получаю

Неопределенный индекс: joinColumns в BasicEntityPersister.php

Я попробовал это также только с

    /**
 * @var \Doctrine\Common\Collections\Collection
 *
 * @ORM\ManyToMany(targetEntity="Sections", inversedBy="editedBook")
 * @ORM\JoinTable(name="edited_book_has_section")
 */ 

или переключение определения, но затем я получаю эту ошибку

You cannot search for the association field '\Entity\EditedBooks#section', because it is the inverse side of an association. Find methods only work on owning side associations.

Временное решение. Сегодня я попытался решить проблему с построителем запросов в моем репозитории editedBooksRepository.

        $query = $qb->select('books')
        ->from('Bundle:EditedBooks', 'books')
        ->leftJoin('books.section', 'sec')
        ->addSelect('COUNT(sec.id) AS sec_count')
        ->andWhere('sec_count = 0');

Но я получил следующую ошибку:

Исключение произошло при выполнении 'SELECT e0_.id КАК id0, e0_.doi КАК doi1, e0_.isbn_print КАК isbn_print2, e0_.isbn_electronic КАК isbn_electronic3, e0_.publication_date КАК публикация_date4, e0_.price_print КАК price_print5, e0_.price_electronic КАК price_electronic6, e0_ .summary КАК резюме7, e0_.title КАК title8, e0_.постоянно КАК в процессе9, e0_.pages КАК страницы10, e0_.иллюстрации КАК иллюстрации11, e0_.entry_date КАК entry_date12, e0_.google_id КАК google_id13, e0_.specialIssue_comment КАК specialIssue_comment14, e0_.deleted КАК удалён15, e0_.specialIssue_id КАК specialIssue_id16, COUNT(s1_.id) КАК sclr17, e0_.book_series_id КАК book_series_id18, e0_.copyright_id КАК copyright_id19, e0_.publisher_id КАК publisher_id20 ИЗ edited_books e0_ ЛЕВОЕ СОЕДИНЕНИЕ НА edited_book_has_section e0_.id = e2_.editedbooks_id ЛЕВОЕ СОЕДИНЕНИЕ разделов s1_ ON s1_.id = e2_.sections_id ГДЕ sclr17 = 0':

SQLSTATE[42S22]: столбец не найден: 1054 Неизвестный столбец «sclr17» в «предложении where»

но мне кажется, что sclr17 существует, я что-то упустил?

Уродливый обходной путь Я знаю, что это неправильно, но иногда мужчина должен делать то, что должен делать мужчина:

    $noSection = new Sections();      
    $noSection->setTitle("Sectionless");
    //add all the books 
    $noSection->setEditedBook(new ArrayCollection($books));
    //remove the assigned ones
    foreach($sections as $section){
        $sBooks = $section->getEditedBook();
        foreach($sBooks as $b){
            $noSection->removeEditedBook($b);
        }
    }

С грязным исправлением теперь все работает, но я рад любому другому решению.


person MassiveDev    schedule 26.09.2014    source источник
comment
Нашли ответ на этот?   -  person Abstract    schedule 04.10.2014


Ответы (2)


Вот рабочий пример

    class Audio
    {
      /**
      * @ORM\ManyToMany(targetEntity="Acme\MyBundle\Entity\Groupe",inversedBy="audios")
      */
      private $groupes;

  class Groupe
  {

    /**
    * @ORM\ManyToMany(targetEntity="Acme\MyBundle\Entity\Audio",mappedBy="groupes")
    */
    private $audios;

Обратите внимание, что атрибуты mappedby и inversedby, а также атрибуты имеют в конце букву «s». (Groupe => private $groupe s ). Может быть, это поможет вам

person oligan    schedule 26.09.2014
comment
Нет, я изменил его в соответствии с вашим образцом, но безуспешно, спасибо за предложение. - person MassiveDev; 26.09.2014

Разве вы не можете просто проверить с нулем?

$query = $qb->select('books')
    ->from('Bundle:EditedBooks', 'books')
    ->leftJoin('books.section', 'sec')
    ->where('sec IS NULL');
person Tobias    schedule 19.02.2016