Использование Doctrine2 / Zend Framework 1.11 со столбцом, содержащим подчеркивание - PullRequest
2 голосов
/ 06 марта 2012

Я занимаюсь рефакторингом веб-сайта в Zend Framework 1.11 / Doctrine 2 и у меня есть несколько устаревших таблиц, содержащих имена столбцов с подчеркиванием (например, plant_id). (Изначально был довольно интимным, но Доктрина неизменно впечатлила меня!)

Я успешно установил сущность доктрины (следуя превосходной книге У.Дж. Гилмора «Легкий PHP с Zend Framework»), но у меня возникают проблемы, когда мы используем магический искатель findOne от Doctrine с устаревшими именами столбцов, которые содержат подчеркивание

код

$plant = $this->em->getRepository('Entities\Plant')
->findOneByPlant_id('3571');

возвращает ошибку

Message: Entity 'Entities\Plant' has no field 'plantId'. You can therefore not call 'findOneByPlant_id' on the entities' repository

(Между прочим, Doctrine в противном случае выглядит нормально - мы создали сущность с этим именем нашего столбца и можем извлечь этот столбец.)

Тем временем мы решили эту проблему, построив запрос с помощью построителя запросов.

Есть ли какое-либо другое более простое решение, для которого не требуется слишком много кода, кроме изменения всей таблицы целиком для удаления подчеркивания (не так просто, поскольку существует много устаревшего кода, который мы должны были бы переработать)?

Ответы [ 2 ]

3 голосов
/ 06 марта 2012

Вы не используете имя столбца в магических поисках, но свойство сущности.Имена свойств вообще не должны совпадать с реальными именами столбцов.

Попробуйте что-то вроде следующего ...

/**
 * @Entity
 */
class Plant
{
    /**
     * @Id
     * @Column(name="plant_id", type="integer")
     */
    private $id;

Тогда вы можете просто использовать

$plant = $plantRepository->find(3571);

Если вы используете столбец без первичного ключа, вы просто используете имя свойства, например,

/**
 * @Column(name="some_col_with_underscores")
 */
private $someProperty;

и через репозиторий

$repo->findOneBySomeProperty($val)

Вы также можете использоватьметод массива

$repo->findOneBy(array('someProperty' => $val));
2 голосов
/ 06 марта 2012

Есть одна вещь, которую вы могли бы сделать, но это может быть не лучшим подходом.Так как Doctrine, вероятно, догадывается, что подчеркивание предназначено для верблюдов.

Вы можете создать свой собственный класс хранилища .Когда вы создаете этот класс, вы реализуете метод findyByPlant_Id ($ id) и создаете в своем методе qb:

<?php
class PlantRepository extends Doctrine\ORM\Repository {
  function findByPlant_Id($id) {
    $qb = $this->createQueryBuilder('p')->where('p.id = :id')->setParameter('id' ,$id);

    return $qb->getQuery()->getOneOrNullResult();
  }
}
?>

Я должен сказать, что я не проверял синтаксис, но он по крайней мере подталкивает васв правильном направлении, если вам нравится это решение.Там могут быть лучшие решения ...

...