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.

        Issue Links

          Activity

          Hide
          Simon Paridon added a comment -

          Column names starting with an underscore seems to be a fringe case; however, this seems to be a special case of the more general problem described in DDC-2838.

          Show
          Simon Paridon added a comment - Column names starting with an underscore seems to be a fringe case; however, this seems to be a special case of the more general problem described in DDC-2838 .

            People

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

              Dates

              • Created:
                Updated: