Antiless
@Antiless

Немного вопросов по DoctrineORM и Symfony?

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

1) В документации советуют ко всем полям сущности прописывать гетеры/сетеры. Я не понимаю зачем, если в php есть __call(). Ситуация, когда нужно сделать индивидуальную обработку поля - ясна, но зачем в большинстве случаев засорять класс однотипными методами - мне не понятно. В чем смысл?

2) Сделал внешний ключ от адреса к пользователю, указал действия каскадом, связь в PMA отображается, но родительский элемент не желает удаляться т.к. есть дочерние. В чем проблема?

/**
* @ORM\ManyToOne(targetEntity="Customer", cascade={"remove"}, fetch="EAGER")
* @ORM\JoinColumn(name="customer_id", referencedColumnName="customer_id")
*/
protected $customerId;


3) При сохранении адреса, фреймворк требует в поле $customerId передавать объект типа Customer. Я понимаю, что он скорее всего запросит id у объекта, но заче грузить в память целый объект, если я, например, заранее знаю его id? А если я хочу множество адресов переработать, то для каждого грузить его пользователя - странно выходит. Можно как-то исправить, чтобы требовалось скалярное значение, не убирая связи между сущностями?

4) Как сделать ORM-аннотацию, чтобы поле типа "datetime" заполнялось текущими датой-временем? Я написал так:

/**
* @ORM\Column(type="datetime", name="inserted_at", options={"default" : "CURRENT_TIMESTAMP"})
*/

, но сохранение БД не происходит т.к. поле не может быть NULL. Гугл подсказал варианты в конструкторе или сеттере заполнять самому, но странно как-то делать то, что может сделать БД сама.

Спасибо всем неравнодушным ))
  • Вопрос задан
  • 1051 просмотр
Решения вопроса 2
riky
@riky
Laravel
1) доктрина для всех ваших сущностей создает прокси объекты, и в дальнейшем вы будете из базы получать их. в прокси объектах для геттеров и сеттеров она делает методы обертки.
+ с call очень не удобно работать, тк нет автодополнения в среде разработки, только изза этого я бы кэлл не стал использовать.

2) возможно кеш не сбросили, доктрина бывает кеширует аннотации и при небольшом их изменении не применяет сразу.

3) смиритесь. оверхэд есть конечно, сам возмущался в начале, но ООП требует жертв.

4) да, просто добавляете в конструктор, никаких проблем нет, из плюсов то что это поле сразу же доступно, а также мега бонус для написания тестов, когда нужно создавать объекты с указанными датами.
Ответ написан
artem90
@artem90
TeamLead, Developer
3. Можно использовать reference
Тут есть пример stackoverflow.com/a/26257234
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
index0h
@index0h
PHP, Golang. https://github.com/index0h
Я не понимаю зачем, если в php есть __call().

Магию сложно дебажить, тестировать и поддерживать. Она может потребоваться но в очень-очень узких кейсах, когда по другому никак. Геттеры с сеттерами - это далеко не тот случай, учитывая, что IDE тип PhpStorm их отлично генерирует.

Ситуация, когда нужно сделать индивидуальную обработку поля - ясна, но зачем в большинстве случаев засорять класс однотипными методами - мне не понятно. В чем смысл?

За тем, что бы не засорять его никому не нужной магией.

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

При выборке доктрина генерирует прокси классы, которые догружают и гидрируют дочерние объекты в случае необходимости. Хотите чисто id - не объявляйте связь))

А если я хочу множество адресов переработать, то для каждого грузить его пользователя - странно выходит.

Почему же? Хотите работать с адресами - работайте с адресами, при чем тут пользователи?

Как сделать ORM-аннотацию, чтобы поле типа "datetime" заполнялось текущими датой-временем?

Добавьте значение по умолчанию в конструктор.
Ответ написан
Комментировать
AndreyShakhtarin
@AndreyShakhtarin
Один из Землян
Как сделать ORM-аннотацию, чтобы поле типа "datetime" заполнялось текущими датой-временем?

class Имя_Класса
{

     $поле_времяни;
     /**
     * Set поле_времяни
     *
     * @param \DateTime
     *
     * @return Имя_Класса
     */
    public function поле_времяни()
    {
        $this->поле_времяни = new \DateTime('today');
    }
}

еще можно вместо 'today' записать 'now', что одно и тоже.

обычно так делаю...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы