Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Вопрос в том, каким способом лучше поднимать связанные данные, всё сразу или с отложенной загрузкой?
при чем последние методы работают одинаково, как для одного объекта, так и для коллекции объектов (похоже на Composite).
$post = $repository->find(1);
$comments = $post->getComments(); // комментарии к посту с id 1
$posts = $repository->findBy(['author' => 'Вася']);
$comments = $posts->getComments(); // комментарии к постам Васи
$post = new Post;
$post->addTags( [1,2,3] );
$qa = new QA;
$qa->addTags( [1,2,3] );
$post = new Post;
$qa = new QA;
Tag::addTo( $post , [1,2,3]);
Tag::addTo( $qa , [1,2,3]);
Код, реализующий сохранение связей, должен быть в методах сущности, которая «владеет» этими связями (не в подчинённых объектах).
$post = new Post;
$qa = new QA;
$tag1 = new Tag(1);
$tag2 = new Tag(2);
$tag3 = new Tag(3);
$post->addTag($tag1);
$post->addTag($tag2);
$post->addTag($tag3);
$qa->addTag($tag1);
$qa->addTag($tag2);
$qa->addTag($tag3);
$post->addTags([$tag1, $tag2, $tag3]);
$qa->addTags([$tag1, $tag2, $tag3]);
select * from adv_db_stat where (variant_id = %(A)s or -1 = %(A)s) and (campaign_id = %(B)s or -1 = %(B)s);
select * from adv_db_stat where (variant_id = 1 or -1 = 1) and (campaign_id = -1 or -1 = -1);
select * from adv_db_stat where variant_id = 1;
SELECT * FROM post LEFT JOIN comment WHERE post.id = comment.post_id
при чем последние методы работают одинаково, как для одного объекта, так и для коллекции объектов
getComment() ещё оправдана для одного объекта, то для коллекции хотя бы метод должен называться по другому, например loadComments(). По-моему выражение $comments = $posts->getComment(); очень неочевидное. Что оно возвращает? Меняется ли $posts: Имхо, лучше $posts->loadComments(); или $posts->fillComments(); $post = $repository->find(1);
$comments = $post->geComments(); // lazy load
$post = $repository->find(2);
$repository->loadComments([$post]); // direct load
$posts = $repository->findBy(['author' => 'Вася']);
$repository->loadComments($posts); // direct load
По хорошему этот метод не должен быть в самом объекте.
Несколько простых запросов вместо одного большого для загрузки связей в ORM