[DCOM-249] Criteria are unable to locate getters for properties with an underscore prefix Created: 30/Jul/14  Updated: 15/Dec/14

Status: Open
Project: Doctrine Common
Component/s: Collections
Affects Version/s: 2.4.2
Fix Version/s: None

Type: Bug Priority: Minor
Reporter: Zach Garwood Assignee: Benjamin Eberlei
Resolution: Unresolved Votes: 0
Labels: collection, criteria, getter

Issue Links:
Reference
relates to DDC-2838 Leaky abstraction when applying Crite... Reopened

 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.



 Comments   
Comment by Simon Paridon [ 15/Dec/14 ]

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.





[DCOM-260] Allow positional and named parameters for annotations Created: 10/Dec/14  Updated: 14/Dec/14  Resolved: 14/Dec/14

Status: Resolved
Project: Doctrine Common
Component/s: Annotations
Affects Version/s: None
Fix Version/s: None

Type: Improvement Priority: Minor
Reporter: Javier Eguiluz Assignee: Benjamin Eberlei
Resolution: Can't Fix Votes: 0
Labels: None


 Description   

When using annotations, is very common to repeatedly use the same set of parameters. For instance, when using the @Route annotation is common to define just the path and its name.

With the current Doctrine annotations, you can only have one unnamed argument (in this case, the path) and the rest of parameters (in this case, the route name) must define their names:

// this is how it works
@Route("/", name="homepage")

// this doesn't work, but it'd be great if it did
@Route("/", "homepage")

This issue just asks Doctrine managers if they are willing to enhance annotations to allow for named, positional and mixed parameters:

 /**
  * // named parameters
  * @Assert(expression = "value > 18", message="You must be 18 years old or older.")
  *
  * // mixed parameters
  * @Assert("value > 18", message="You must be 18 years old or older.")
  *
  * // positional parameters
  * @Assert("value > 18", "You must be 18 years old or older.")
  */
private $age;


 Comments   
Comment by Marco Pivetta [ 10/Dec/14 ]

This issue just asks Doctrine managers if they are willing to enhance annotations to allow for named, positional and mixed parameters

I suggest you to directly open a pull request, since we don't have anyone who would work on it (resource-wise) in first place

Comment by Javier Eguiluz [ 14/Dec/14 ]

I'm closing this issue because I can't fix it and Doctrine project doesn't have the resources to do it.





Generated at Sun Dec 21 06:57:20 UTC 2014 using JIRA 6.2.3#6260-sha1:63ef1d6dac3f4f4d7db4c1effd405ba38ccdc558.