Сергей
Павел, Вы скажите сколько это стоить будет.
Павел
Это будет стоить копейки, но у меня есть более важные дела
Сергей
Ясно, может кто то поможет сделать. Кто сейчас свободен.
Павел
В принципе можешь написать в личку доступ к SSH, T если свободное время появится то я сделаю
Сергей
Хорошо, я напишу. Спасибо.
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
тебе ж явно нужна будет связь пост -> автор
мне нужна будет связь автор -> посты. Остально не важно. Хочу получать всех авторов и их посты
fink3L
хотя может мне вообще маппинг не нужен?
Denys
а мой варинат же норм?
Denys
чем моя одностороняя связь плоха?
fink3L
чем моя одностороняя связь плоха?
какая то мани-ту-мани связь
Denys
ссылка поломалась
Denys
https://goo.gl/Hr4kQy
Denys
во
Alexey
мне нужна будет связь автор -> посты. Остально не важно. Хочу получать всех авторов и их посты
Для этого тебе связь со стороны автора не нужна. Это делается методом в репозитории. Связь OneToMany - это сахарок, который заставляет доктрину вращаться медленее.
Alexey
@fes0r Поправь меня, если я неправ.
fink3L
я тупанул
fink3L
во первых это 100500 запросов, если захочется связь дернуть
fink3L
бес попутал)
fink3L
простите
Alexey
во первых это 100500 запросов, если захочется связь дернуть
Это тоже нет, ЕМНИП. 100500 запросов будет, если ты сделаешь там связь EAGER, а потом будешь у каждого автора докапываться до постов.
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 у автора будет заполнено сразу после него объектами постов.
Alexey
В остальных у тебя будут запрошены из БД только авторы, а при каждой попытке получить все посты из коллекции $posts будет генериться новый запрос. От каждого автора.
Alexey
3 вариант это в репозитории же?)
2 и 3 делается в репозитории. 1 - в маппинге. Но fetch=EAGER надо очень с умом применять. Если ты решил, что он тебе нужен - возможно, он тебе не нужен, а стоит как-то денормализовать данные.
Alexey
Для закрепления (я выше ошибся же): - LAZY и EXTRA_LAZY - дополнительные запросы при получении элементов коллекции - EAGER - автоматический join
Alexey
ну как бы да, зачем всегда грузить посты с авторами
Да. Поэтому у тебя просто будет метод у репозитория, который тебе вернёт, если надо, авторов и их посты одним запросом.
fink3L
Да. Поэтому у тебя просто будет метод у репозитория, который тебе вернёт, если надо, авторов и их посты одним запросом.
а как вообще такая практика? 1 метод репозитория принимает на вход qb (там же вроде queryBulder строит запрос?) и возвращает qb с частью запроса на выборку авторов, 2 метод принимает qb и добавляет к тему посты и возвращает тоже qb. И так далее.. и потом просто getQuery->fetch или как там.
Alexey
А откуда берётся первый QueryBuilder, который в первый метод попадает?
Alexey
И да, можно строить запрос через QB, можно написать DQL. Можно даже по чистому SQL угореть (но зачем?).
Alexey
В смысле зачем тебе чистый SQL для таких простых операций, если ты решил использовать Doctrine. Как по мне, если ты пользуешься Doctrine, то чистый SQL только для тяжёлых случаев платформозависимых и подобного. Ну или если тебе в подавляющем большинстве случаев нужен именно SQL, то может быть тебе не нужна Doctrine.
fink3L
А откуда берётся первый QueryBuilder, который в первый метод попадает?
ну допустим, он создается в первом методе getAuthers() а дальше на него пошел вешать, скоупы(это вроде так называется?)
fink3L
хм, может я что-то не то придумал, сейчас попробую
fink3L
просто не совсем точно себе представляю как там строиться запрос через qb
fink3L
но вроде же типа того qb.select(a).from(a authors).getQuery().fetch() ?
fink3L
я с телефона
fink3L
сори за код в таком виде)
Alexey
Ну... Что-то типа того. Только скорее getResult(). И да, ты тут выбираешь авторов из самих же авторов :)
Alexey
ДРугими словами запрос бессмысленный.
fink3L
ну типа у репозитория уже есть такие методы?
Alexey
Вот если a.authors на p.authors заменить - тогда смысла больше.
Alexey
Нет, это не методы репозитория, это методы QueryBuilder. Не путай их.
Alexey
В методе репозитория ты делаешь что-нибудь типа $qb = $this->createQueryBuilder('a'); И с ним работаешь.
fink3L
Нет, это не методы репозитория, это методы QueryBuilder. Не путай их.
ну это я понимаю, просто я имел ввиду, что зачем в репозиторий дописывать метод который будет выбирать всех авторов)
Alexey
Ну либо можешь просто DQL писать и исполнять. QueryBuilder не обязательно для простых запросов использовать. Он полезен, когда надо динамически составлять.
fink3L
Если это репозиторий авторов, то он там уже есть - findAll().
а где, как не там, мне еще писать эти методы
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
подправил, ну это так набросок. А на счет параметров, не знаю, наверно не охото чтоб метод findActiveAuthorsWithPost разрастался.
fink3L
но я тоже, тот еще погромист)
fink3L
а еще вопрос, через qb можно приджойнить таблицу, на которую у сущности нет маппинга?)
fink3L
ну если связь authors и post в маппинге не указаны
Ivan
порой fk напрягают