@symfony_ru

Страница 55 из 138
finkel
29.12.2016
16:37:24
подскажите как лучше сделать, есть 2 сущности Author и Post. Надо связать их A one-to-many P, но при этом маппинг Post нельзя трогать, он в стороннем бандле.

можно ключевых слов накинуть и я погуглю

Denis denya Voskoboinik
29.12.2016
16:59:13
может так? http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/association-mapping.html#one-to- many-unidirectional-with-join-table

Sergey
29.12.2016
17:04:13
> маппинг Post нельзя трогать, он в стороннем бандле. эм... переопредели из своего

Google
Sergey
29.12.2016
17:04:58
тебе ж явно нужна будет связь пост -> автор

возможно связь автор -> посты не нужна даже

finkel
29.12.2016
17:11:47
тебе ж явно нужна будет связь пост -> автор
мне нужна будет связь автор -> посты. Остально не важно. Хочу получать всех авторов и их посты

хотя может мне вообще маппинг не нужен?

Denis denya Voskoboinik
29.12.2016
17:12:01
а мой варинат же норм?

чем моя одностороняя связь плоха?

finkel
29.12.2016
17:15:18
чем моя одностороняя связь плоха?
какая то мани-ту-мани связь

Denis denya Voskoboinik
29.12.2016
17:15:43
ссылка поломалась

https://goo.gl/Hr4kQy

во

Алексей
29.12.2016
19:06:47
мне нужна будет связь автор -> посты. Остально не важно. Хочу получать всех авторов и их посты
Для этого тебе связь со стороны автора не нужна. Это делается методом в репозитории. Связь OneToMany - это сахарок, который заставляет доктрину вращаться медленее.

@fes0r Поправь меня, если я неправ.

finkel
29.12.2016
19:07:43
Google
finkel
29.12.2016
19:07:49
я тупанул

во первых это 100500 запросов, если захочется связь дернуть

бес попутал)

простите

Алексей
29.12.2016
19:09:05
во первых это 100500 запросов, если захочется связь дернуть
Это тоже нет, ЕМНИП. 100500 запросов будет, если ты сделаешь там связь EAGER, а потом будешь у каждого автора докапываться до постов.

Алексей
29.12.2016
19:09:32
Если Мне Не Изменяет Память.

Типа As Far As I Know (AFAIK)

finkel
29.12.2016
19:10:05
ну смотри, если я достану всех авторов и потом в цикле getPosts()

по идеи же каждый раз дергать будет?

Алексей
29.12.2016
19:10:29
Нет, смотри. Есть три ситуации в которых будет один запрос:

finkel
29.12.2016
19:10:37
или сразу подгрузит?

Алексей
29.12.2016
19:12:12
1. Если ты указал fetch=EAGER (я, извини, раньше тупанул - там выше LAZY имел в виду). 2. Если ты указал при построении запроса setFetchMode для сущности поста как EAGER (тот же EAGER, только в рамках одного запроса). 3. Если ты сделал select и join связи типа такого: ->select(['a', 'p']) ->leftJoin('a.posts', 'p') В этих трёх случаях будет только один запрос. Поле $posts у автора будет заполнено сразу после него объектами постов.

Алексей
29.12.2016
19:13:47
В остальных у тебя будут запрошены из БД только авторы, а при каждой попытке получить все посты из коллекции $posts будет генериться новый запрос. От каждого автора.

Алексей
29.12.2016
19:14:35
3 вариант это в репозитории же?)
2 и 3 делается в репозитории. 1 - в маппинге. Но fetch=EAGER надо очень с умом применять. Если ты решил, что он тебе нужен - возможно, он тебе не нужен, а стоит как-то денормализовать данные.

Алексей
29.12.2016
19:15:49
Для закрепления (я выше ошибся же): - LAZY и EXTRA_LAZY - дополнительные запросы при получении элементов коллекции - EAGER - автоматический join

ну как бы да, зачем всегда грузить посты с авторами
Да. Поэтому у тебя просто будет метод у репозитория, который тебе вернёт, если надо, авторов и их посты одним запросом.

Google
finkel
29.12.2016
19:23:30
Да. Поэтому у тебя просто будет метод у репозитория, который тебе вернёт, если надо, авторов и их посты одним запросом.
а как вообще такая практика? 1 метод репозитория принимает на вход qb (там же вроде queryBulder строит запрос?) и возвращает qb с частью запроса на выборку авторов, 2 метод принимает qb и добавляет к тему посты и возвращает тоже qb. И так далее.. и потом просто getQuery->fetch или как там.

Алексей
29.12.2016
19:24:28
А откуда берётся первый QueryBuilder, который в первый метод попадает?

И да, можно строить запрос через QB, можно написать DQL. Можно даже по чистому SQL угореть (но зачем?).

Алексей
29.12.2016
19:26:43
В смысле зачем тебе чистый SQL для таких простых операций, если ты решил использовать Doctrine. Как по мне, если ты пользуешься Doctrine, то чистый SQL только для тяжёлых случаев платформозависимых и подобного. Ну или если тебе в подавляющем большинстве случаев нужен именно SQL, то может быть тебе не нужна Doctrine.

finkel
29.12.2016
19:27:01
А откуда берётся первый QueryBuilder, который в первый метод попадает?
ну допустим, он создается в первом методе getAuthers() а дальше на него пошел вешать, скоупы(это вроде так называется?)

finkel
29.12.2016
19:28:59
хм, может я что-то не то придумал, сейчас попробую

просто не совсем точно себе представляю как там строиться запрос через qb

но вроде же типа того qb.select(a).from(a authors).getQuery().fetch() ?

я с телефона

сори за код в таком виде)

Алексей
29.12.2016
19:34:29
Ну... Что-то типа того. Только скорее getResult(). И да, ты тут выбираешь авторов из самих же авторов :)

Алексей
29.12.2016
19:35:04
ДРугими словами запрос бессмысленный.

finkel
29.12.2016
19:35:26
ну типа у репозитория уже есть такие методы?

Алексей
29.12.2016
19:35:29
Вот если a.authors на p.authors заменить - тогда смысла больше.

Нет, это не методы репозитория, это методы QueryBuilder. Не путай их.

В методе репозитория ты делаешь что-нибудь типа $qb = $this->createQueryBuilder('a'); И с ним работаешь.

finkel
29.12.2016
19:38:43
Нет, это не методы репозитория, это методы QueryBuilder. Не путай их.
ну это я понимаю, просто я имел ввиду, что зачем в репозиторий дописывать метод который будет выбирать всех авторов)

Google
Алексей
29.12.2016
19:38:50
Ну либо можешь просто DQL писать и исполнять. QueryBuilder не обязательно для простых запросов использовать. Он полезен, когда надо динамически составлять.

finkel
29.12.2016
19:39:55
Если это репозиторий авторов, то он там уже есть - findAll().
а где, как не там, мне еще писать эти методы

Алексей
29.12.2016
19:40:27
Ну там, да. Я не понял, в чём вопрос-то. Я тебя не призываю дублировать уже имеющуюся функциональность.

finkel
29.12.2016
19:42:27
я просто не договорил. Пример работы qb это был вопрос, что бы уточнить, примерно, правильно ли я понимаю механизм) Это даже скорее псевдо язык был)

а идея в том

точнее вопрос, примерно так должен выглядеть репозиторий? AuthorsRepository + findActiveAuthorsWithPost(): Authors [] - createAutherQuery(void): QueryBuilder; - withPost(QB): QueryBuilder qb; - withoutBanned(QB): QueryBuilder qb; внутри публичного метода, просто цепочка вызовов нижних, приватных методов, а потом getQuery.getResult

Алексей
29.12.2016
19:55:31
findAllQueryBuilder() - это "найти весь QueryBuilder"? :) 3 и 4 пункты - это какие-то костыли. Тебе ничего не мешает передать во второй метод параметром флаг, что надо заджойнить посты, например. Или просто отдельный метод, который делает запрос на авторов с постами. В общем, ты придумываешь лишнее, как мне кажется.

Хотя я сам тот ещё мастер лучших практик. Подожди, может тебе кто поумнее ответит.

Admin
ERROR: S client not available

finkel
29.12.2016
20:03:19
подправил, ну это так набросок. А на счет параметров, не знаю, наверно не охото чтоб метод findActiveAuthorsWithPost разрастался.

но я тоже, тот еще погромист)

а еще вопрос, через qb можно приджойнить таблицу, на которую у сущности нет маппинга?)

ну если связь authors и post в маппинге не указаны

Sergey
29.12.2016
21:12:31
и то не уверен

вообще логика оч простая

Google
Sergey
29.12.2016
21:13:02
если для бизнес логики связь не нужна но надо что-то выбрать оптимально

есть вариант при котором тебе тупо не нужна ORM конкретно для этой выборки

Sergey
29.12.2016
21:39:46
а блин, наркомания какая-то)
мне кажется тут пахнет культом карго

Ринат
29.12.2016
21:40:24
что за культ?

Sergey
29.12.2016
21:40:34
загугли

http://simon-says-architecture.com/2011/08/23/repository

описание хорошего репозитория

самое важное почему скинул вот тут: > Returns one object or throws exception… Why? Because we don’t invoke any action on a collection of domain objects. Ever.

в последний месяц я все чаще и чаще соглашаюсь с этим...

Sergey
30.12.2016
09:29:35
а можно по русски?
Методы репозитория должны либо вернуть одну сущность либо кинуть исключение. Почему? Потому что мы не будет выполнять никаких действий над коллекцией сущностей. Никогда.

мол если тебе нужно делать что-то с коллекцией сущности, значит должна быть другая сущность, которая в себе хранит эту коллекцию

и код выполняющий логику работы с этой коллекцией должен быть прямо в сущности

ну идея такая

Sergio
30.12.2016
09:42:26
ага

спасибо за разьяснение

Sergey
30.12.2016
09:42:47
во славу CQRS короч

Sergio
30.12.2016
09:42:53
очень логичненько даже вполне себе

Rodion
30.12.2016
09:46:32
жаль, что с symfony-формами придется тогда дополнительно сношаться, писать дата-мапперы, дата-трансформеры.

Страница 55 из 138