Павел
Сергей
Павел, Вы скажите сколько это стоить будет.
Павел
Это будет стоить копейки, но у меня есть более важные дела
Сергей
Ясно, может кто то поможет сделать. Кто сейчас свободен.
Павел
В принципе можешь написать в личку доступ к SSH, T если свободное время появится то я сделаю
Сергей
Хорошо, я напишу. Спасибо.
fink3L
fink3L
подскажите как лучше сделать, есть 2 сущности Author и Post. Надо связать их A one-to-many P, но при этом маппинг Post нельзя трогать, он в стороннем бандле.
fink3L
можно ключевых слов накинуть и я погуглю
Denys
может так?
http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/association-mapping.html#one-to-
many-unidirectional-with-join-table
Sergey
> маппинг Post нельзя трогать, он в стороннем бандле.
эм... переопредели из своего
Sergey
тебе ж явно нужна будет связь пост -> автор
Sergey
возможно связь автор -> посты не нужна даже
fink3L
хотя может мне вообще маппинг не нужен?
Denys
а мой варинат же норм?
Denys
чем моя одностороняя связь плоха?
fink3L
Denys
ссылка поломалась
Denys
https://goo.gl/Hr4kQy
Denys
во
Alexey
@fes0r Поправь меня, если я неправ.
fink3L
fink3L
я тупанул
fink3L
во первых это 100500 запросов, если захочется связь дернуть
fink3L
бес попутал)
fink3L
простите
fink3L
Alexey
Если Мне Не Изменяет Память.
Alexey
Типа As Far As I Know (AFAIK)
fink3L
ну смотри, если я достану всех авторов и потом в цикле getPosts()
fink3L
по идеи же каждый раз дергать будет?
Alexey
Нет, смотри. Есть три ситуации в которых будет один запрос:
fink3L
или сразу подгрузит?
Alexey
1. Если ты указал fetch=EAGER (я, извини, раньше тупанул - там выше LAZY имел в виду).
2. Если ты указал при построении запроса setFetchMode для сущности поста как EAGER (тот же EAGER, только в рамках одного запроса).
3. Если ты сделал select и join связи типа такого:
->select(['a', 'p'])
->leftJoin('a.posts', 'p')
В этих трёх случаях будет только один запрос. Поле $posts у автора будет заполнено сразу после него объектами постов.
fink3L
Alexey
В остальных у тебя будут запрошены из БД только авторы, а при каждой попытке получить все посты из коллекции $posts будет генериться новый запрос. От каждого автора.
fink3L
Alexey
3 вариант это в репозитории же?)
2 и 3 делается в репозитории. 1 - в маппинге. Но fetch=EAGER надо очень с умом применять. Если ты решил, что он тебе нужен - возможно, он тебе не нужен, а стоит как-то денормализовать данные.
fink3L
Alexey
Для закрепления (я выше ошибся же):
- LAZY и EXTRA_LAZY - дополнительные запросы при получении элементов коллекции
- EAGER - автоматический join
Alexey
А откуда берётся первый QueryBuilder, который в первый метод попадает?
Alexey
И да, можно строить запрос через QB, можно написать DQL. Можно даже по чистому SQL угореть (но зачем?).
fink3L
Alexey
В смысле зачем тебе чистый SQL для таких простых операций, если ты решил использовать Doctrine.
Как по мне, если ты пользуешься Doctrine, то чистый SQL только для тяжёлых случаев платформозависимых и подобного. Ну или если тебе в подавляющем большинстве случаев нужен именно SQL, то может быть тебе не нужна Doctrine.
Alexey
fink3L
хм, может я что-то не то придумал, сейчас попробую
fink3L
просто не совсем точно себе представляю как там строиться запрос через qb
fink3L
но вроде же типа того qb.select(a).from(a authors).getQuery().fetch() ?
fink3L
я с телефона
fink3L
сори за код в таком виде)
Alexey
Ну... Что-то типа того. Только скорее getResult().
И да, ты тут выбираешь авторов из самих же авторов :)
fink3L
Alexey
ДРугими словами запрос бессмысленный.
fink3L
ну типа у репозитория уже есть такие методы?
Alexey
Вот если a.authors на p.authors заменить - тогда смысла больше.
Alexey
Нет, это не методы репозитория, это методы QueryBuilder. Не путай их.
Alexey
В методе репозитория ты делаешь что-нибудь типа
$qb = $this->createQueryBuilder('a');
И с ним работаешь.
Alexey
Ну либо можешь просто DQL писать и исполнять. QueryBuilder не обязательно для простых запросов использовать. Он полезен, когда надо динамически составлять.
Alexey
fink3L
Alexey
Ну там, да. Я не понял, в чём вопрос-то. Я тебя не призываю дублировать уже имеющуюся функциональность.
fink3L
я просто не договорил. Пример работы qb это был вопрос, что бы уточнить, примерно, правильно ли я понимаю механизм) Это даже скорее псевдо язык был)
fink3L
а идея в том
fink3L
точнее вопрос, примерно так должен выглядеть репозиторий?
AuthorsRepository
+ findActiveAuthorsWithPost(): Authors []
- createAutherQuery(void): QueryBuilder;
- withPost(QB): QueryBuilder qb;
- withoutBanned(QB): QueryBuilder qb;
внутри публичного метода, просто цепочка вызовов нижних, приватных методов, а потом getQuery.getResult
Alexey
findAllQueryBuilder() - это "найти весь QueryBuilder"? :)
3 и 4 пункты - это какие-то костыли. Тебе ничего не мешает передать во второй метод параметром флаг, что надо заджойнить посты, например. Или просто отдельный метод, который делает запрос на авторов с постами.
В общем, ты придумываешь лишнее, как мне кажется.
Alexey
Хотя я сам тот ещё мастер лучших практик. Подожди, может тебе кто поумнее ответит.
fink3L
fink3L
подправил, ну это так набросок. А на счет параметров, не знаю, наверно не охото чтоб метод findActiveAuthorsWithPost разрастался.
fink3L
но я тоже, тот еще погромист)
fink3L
а еще вопрос, через qb можно приджойнить таблицу, на которую у сущности нет маппинга?)
fink3L
ну если связь authors и post в маппинге не указаны
Ivan
Ivan
порой fk напрягают