Юра
эти струстркты сделаны на С++?
Юра
типо эксеншн + полифил?
Andrii
а opcache.enable_cli включен?
Юра
а opcache.enable_cli включен?
В данном случае без разницы
Юра
Я же запускаю скрипт один раз и в цикле гоняю
Юра
Тут можно попробовать джит. Я не знаю активен ли он по дефолту или нет
𝕎𝕒𝕣𝕞
Здравствуйте, у меня такая проблема, реализовано 2 сущности, пользователь и блог, и между ними связь многие ко многим(поле авторы у блога, и поле блоги у пользователя). Проблема такая: не могу нормально удалить автора у отдельного блога, просматривать авторов приходится через UserRepository, а вроде как нужно BlogRepository, нативный метод в объекте возвращает только отдого автора(меня), с добавлением также костыль, я добавляю не в блог новых авторов, а получа автора по id и добавляю к нету блог, это же неправильно? или я заблуждаюсь?
𝕎𝕒𝕣𝕞
Исходники сущностей: https://notabug.org/KawaiiNekoChan/ZXC.Blog/src/main/src/Entity
Gleb
И там ещё можно либо самому ансетить связь, либо через доп параметр в описании связи, сейчас пример описания скину
Gleb
По поводу добавления, как сделаете. Добавление\удаление через сеттер\геттер, он пишется руками. Я делал сущностями, не по id
Konstantin
Тут можно попробовать джит. Я не знаю активен ли он по дефолту или нет
это мемори-задача, вряд ли она в цпу упирается чтобы джит помог
𝕎𝕒𝕣𝕞
Просто пользовательский ввод это id, я получаю по нему сущность и с ней работаю
Gleb
Я делал вот так: поле в сущности #[ORM\ManyToMany(targetEntity: 'User', mappedBy: 'skills', orphanRemoval: true)] #[ORM\JoinTable(name: 'skills_users')] #[ORM\JoinColumn(name: 'skill_id', referencedColumnName: 'id')] #[ORM\InverseJoinColumn(name: 'user_id', referencedColumnName: 'id')] private Collection $users; и геттеры\сеттеры, все норм работает. public function addUser(User $user): void { if (!$this->users->contains($user)) { $this->users->add($user); } } public function removeUser(User $user): void { if ($this->users->contains($user)) { $this->users->removeElement($user); } } Что бы не делать лишних плясок с обнулением связи с другой стороны использовал как раз доп.свойство orphanRemoval: true
Gleb
Коллекции вытягиваются сами, репозиторий сюда подтягивать не пришлось.
𝕎𝕒𝕣𝕞
У меня вроде работает, но теперь перестало добовлять в перекрёстную таблицу
Nikolay
У меня вроде работает, но теперь перестало добовлять в перекрёстную таблицу
Если у вас двусторонняя связь, обычно надо обе сущности обновлять
Юра
Доктрина смотрит только на овнинг сайд
Gleb
А можно сущность пользователя в месте skills посмотреть?
#[ORM\ManyToMany(targetEntity: 'Skill', inversedBy: 'users')] #[ORM\JoinTable(name: 'skills_users')] #[ORM\JoinColumn(name: 'user_id', referencedColumnName: 'id')] #[ORM\InverseJoinColumn(name: 'skill_id', referencedColumnName: 'id')] private Collection $skills; public function addSkill(Skill $skill): void { if (!$this->skills->contains($skill)) { $this->skills->add($skill); } } public function removeSkill(Skill $skill): void { if ($this->skills->contains($skill)) { $this->skills->removeElement($skill); } } public function getSkills(): Collection { return $this->skills; }
Gleb
Обе? это как
ну в смысле связь по обоим сущностям указывать.
Konstantin
не будет дебильных проблем с опечатками или переименованной сущностью
Gleb
если уж всё равно аттрибуты, то пишите нормально сразу: #[ORM\ManyToMany(targetEntity: User::class
Спасибо! Это первый код на симфе у меня. Ещё не все привычки после Битрикса поборол.(
Юра
https://gist.github.com/zim32/5a8e6c7c2127f7e91863543fda05f39b
Юра
на тебе
Юра
public function setPosts(iterable|Collection $posts): self { $this->handleOneToMany( $posts, 'posts', 'tag', fn(PostResource $a, PostResource $b) => $a->getId() === $b->getId() ); return $this; }
Konstantin
ужасно
Юра
аргументировано
Konstantin
да ну что тут аргументировать)
Юра
а что тут ужасно?
Konstantin
$owningGetter = 'get' . ucfirst($owningPropertyName); $this->{$propertyName}->exists $owningSetter = 'set' . ucfirst($owningPropertyName);
Юра
и
Nikolay
Konstantin
счастливого дебага, сучечка!
Юра
ну пиши лапшу каждый раз чтобы правильно обработать коллекцию
Юра
я не уверен что она у тебя правильно обрабатывается
Konstantin
это читаемая лапша и очевидная (явное-неявное там, вот это всё), тут же магическая лапша
Юра
представляешь в доктрине тоже магия
Konstantin
и точно так же magic strings - 'posts', 'tag'
Юра
там вообще через рефлексию работает
Юра
🙀
Konstantin
и не сказал бы, что там есть читаемые исключения, типа "чувак, тут нет такого поля. ты, наверное, имел в виду ...?"
Юра
слушай это проще поверь в одном месте правильно написать tags, чем писать в десяти местах одно и то же
Юра
с копипастой и верояностью ошибки
Юра
все эти contains и isset($this->id) и т.д.
Konstantin
ну и там забавно, что имя связи должно быть строго одним словом
Konstantin
назвать как post_authors не выйдет
Konstantin
не особо, мягко говоря, очевидно, что это так
Юра
это как делаю я, можно как угодно доделать, можно передать вообще кложуру
Юра
мне так было удобнее
Юра
мне главное не писать по двдцать раз одно и то же
Юра
я уже насмотрелся на эти сеттеры по 50 строк кода
Юра
хватит )
Юра
Можно конечно не делать сеттеры
Юра
Можно написать $tag->setPost() и забыть добавить этот тег посту, и потом сидеть дебажить пол ночи
Юра
Мне так удобно иметь короткий сеттер и передавать туда массив сразу
Konstantin
когда я вижу сеттер, я точно знаю что оно делает
Konstantin
когда я осчатливлен вот этой прелестью выше, я минут 10 буду материться
Konstantin
читаемости и понятности она не добавила, зато какой-то новый херово документированный слой
Юра
ты же понимаешь что скорее всего твой сеттер для меня например будет такой же прелестью и что это чисто твое понимание своего кода
Konstantin
не, он будет понятный, читаемый и принятый для всех проектов, где есть доктрина
Konstantin
интересно, кстати, а на уровне лиснеров нельзя там разрулить как-нибудь проставку ассоциаций?
Юра
Ну ок покажи свой сеттер
Юра
Пошли меряться сеттерами ))
Vlad
сеттеры и геттеры не нужны)
Konstantin
холодно на улице, у меня маленькие сеттеры!
Юра
Как вы тогда рилейшены хендлите
Vlad
поменяй на public кода меньше станет
Konstantin
смысл этого кода не изменится
Юра
а сразу уточнение что если это симфони формы у меня нет вопросов
Юра
пишите как хотите
Vlad
не знаю, джосны тока гоняю
Юра
ну пришел джсон тибе
Konstantin
сеттеры хоть какую-то инкапсуляцию обеспечивают. допустим (пример просто из вакуума) $post->setAuthor(null) не только автора удаляет, но и сбрасывает флаг is_published. или что-то типа того