Doctrine Common
  1. Doctrine Common
  2. DCOM-249

Criteria are unable to locate getters for properties with an underscore prefix

    Details

      Description

      There are two related entities:
      1) Inquiry:

      use Doctrine\Common\Collections\ArrayCollection;
      use Doctrine\Common\Collections\Criteria;
      use Doctrine\ORM\Mapping as ORM;
      
      /**
       * @ORM\Entity
       * @ORM\Table(name="inquiries")
       */
      class Inquiry
      {
          /**
           * @ORM\OneToMany(targetEntity="Field", mappedBy="_inquiry")
           */
          protected $_fields;
      
          public function __construct()
          {
              $this->_fields = new ArrayCollection();
          }
      
          // ...
      
          public function getFields()
          {
              $criteria = Criteria::create()->orderBy(['index' => Criteria::ASC]);
      
              return $this->_fields->matching($criteria);
          }
      }
      

      2) Field:

      use Doctrine\Common\Collections\ArrayCollection;
      use Doctrine\ORM\Mapping as ORM;
      
      /**
       * @ORM\Entity
       * @ORM\Table(name="fields")
       */
      class Field
      {
          /**
           * @ORM\ManyToOne(targetEntity="Inquiry", inversedBy="_fields")
           * @ORM\JoinColumn(
           *      name="inquiry_id",
           *      referencedColumnName="id",
           *      nullable=false
           * )
           */
          protected $_inquiry;
      
          /**
           * @ORM\Column(name="index", type="integer", nullable=false)
           */
          protected $_index;
      
          // ...
      
          public function setIndex($index)
          {
              $this->_index = $index;
      
              return $this;
          }
      
          public function getIndex()
          {
              return $this->_index;
          }
      }
      

      Obviously, the underscore-prefixed property names are not ideal, but I didn't get to set the coding standard, I just have to follow it.

      When trying to filter an ArrayCollection of Field entities in the Inquiry entity with an ordering criteria, I receive an ORMException with the message "Unrecognized field: index". If I alter the criteria to the following, I receive a PHP error with the message "PHP Fatal error: Cannot access protected property Field::$_index":

      $criteria = Criteria::create()->orderBy(['_index' => Criteria::ASC]);
      

      For whatever reason, Criteria::orderBy() is not finding the Field::getIndex() getter.

      There are two workarounds that I've discovered for this issue:
      The first is to make Field::$_index a public property:

          /**
           * @ORM\Column(name="index", type="integer", nullable=false)
           */
          public $_index;
      

      The second, and the method that I've used, is to make an additional getter:

          public function get_index()
          {
              return $this->getIndex();
          }
      

      I'm not sure why Criteria::orderBy() is unable to locate the Field::getIndex() getter but is able to locate Field::get_index(). And I'm sure that this is only an issue for people with ahem outdated coding standards. But it seems there is a bug with the way that the criteria are accessing getters and properties.

        Activity

        There are no comments yet on this issue.

          People

          • Assignee:
            Benjamin Eberlei
            Reporter:
            Zach Garwood
          • Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

            Dates

            • Created:
              Updated: