Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
 
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> Doctrine, многие ко многим findBy, paginator. Как?, Как сделать?
inpost  
 ۩  [x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Помагите Здесь живу!!!
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 22693
Пользователь №: 20039
На форуме: 6 лет, 11 месяцев, 29 дней
Карма: 599




Всем привет. В Doctrine есть удобный интерфейс find, findby для выборки записей.

Допустим стандартный запрос:
$books = $entityManager->getRepository('Book')->findBy([],null,2,1); // Все записи
foreach($books as $book) {
echo $book->id."\r\n";
foreach($book->authorRead as $author) {
echo '--'.$author->name."\r\n";
}
echo "\r\n";
}

Где таблица Book связана с таблицей Authors по полю "authorRead".

В спойлере спрячу структуру Book и Author, чтобы на всякий случае было бы понятнее.
Свернутый текст
/** @Entity */
class Book
{
/** @Id @GeneratedValue @Column(type="integer") */
public $id;

/**
* Unidirectional - Many users have marked many comments as read
*
*
@ManyToMany(targetEntity="Author",inversedBy="bookAuthor",cascade={"persist", "remove"})
*
@JoinTable(name="book2author")
*/

public $authorRead;

/** @Column(type="datetime", name="date",options={"default": 0}) */
public $date;

/** @Column(type="string", name="name") */
public $name = ''; // По умолчанию пусто


public function __construct()
{
$this->date = new DateTime('now');
$this->id = new \Doctrine\Common\Collections\ArrayCollection;
$this->authorRead = new \Doctrine\Common\Collections\ArrayCollection;
}

}


/** @Entity */
class Author
{
/** @Id @GeneratedValue @Column(type="integer") */
public $id;

/** @Column(type="string", name="name") */
public $name;

/**
* Bidirectional - Many comments are favorited by many users (INVERSE SIDE)
*
*
@ManyToMany(targetEntity="Book", mappedBy="authorRead")
*/

public $bookAuthor;

public function __construct()
{
$this->id = new \Doctrine\Common\Collections\ArrayCollection;
$this->name = 'default value';
}
}


Так вот, как выбрать через LIMIT понятно для findBy. Но чтобы писать LIMIT надо уже знать количество записей. Как работать через queryBuilder я видел в мануале, но там надо писать собственный запрос с JOIN таблица связей + JOIN таблица авторов, а не пользоваться готовым запросом из findBy.
А вот как получить количество записей в данном случае? Гуглю Paginator и нет ответа, гуглю SQL_CALC_FOUND_ROWS в связке с findBy, и тоже не вижу толкового ответа.



--------------------
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
PMПисьмо на e-mail пользователюICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
brevis  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 265
Пользователь №: 39616
На форуме: 2 года, 6 месяцев, 23 дня
Карма: 31




Если я правильно понял о чем речь -- то идея там такая: количество страниц расчитывается уже после того, как достанут записи.
Имея номер текущей страницы и количество записей на страницу высчитываем limit и offset и с помощью того же Paginator'a достаем. А он нам уже расскажет сколько там всего записей, что бы посчитать количество страниц.

На первый взгляд конечно странно. Постоянно в голове крутится мысль "а если передадут номер страцы, для который нет результатов?". Но похоже в этом сообществе проблемы индейцев шерифа не интрересуют. Я с этой херней сталкивался в KnpPaginatorBundle и там тоже именно так.


--------------------
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
brevis  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 265
Пользователь №: 39616
На форуме: 2 года, 6 месяцев, 23 дня
Карма: 31




P.S. Если речь о том чтобы руками не писать джоины -- то можно как-то так:
$repo = $em->getRepository('Book');
$query = $repo->createQueryBuilder('b')->getQuery()
->
setFirstResult($offset)
->
setMaxResults($limit);

// или dql'ом:
$query = $em->createQuery("SELECT b FROM Book b")
->
setFirstResult($offest)
->
setMaxResults($limit);


--------------------
PMПисьмо на e-mail пользователю
    1   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
inpost  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Помагите Здесь живу!!!
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 22693
Пользователь №: 20039
На форуме: 6 лет, 11 месяцев, 29 дней
Карма: 599




О, вроде работает, разобрался!
Спасибо.


--------------------
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
PMПисьмо на e-mail пользователюICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Oyeme  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Reality is wrong. Dreams are for real
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1674
Пользователь №: 16955
На форуме: 7 лет, 9 месяцев, 11 дней
Карма: 94






--------------------
Programming: Private lessons via skype £45/h

Частные уроки в Лондоне / удаленно по skype.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
inpost  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Помагите Здесь живу!!!
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 22693
Пользователь №: 20039
На форуме: 6 лет, 11 месяцев, 29 дней
Карма: 599




Oyeme
Конечно я читал документацию :) Там же через createQuery, где надо было вручную писать весь запрос с JOIN + JOIN. Поэтому и был мой вопрос.
Я, видимо, в прошлых страницах документации прозевал, что можно сделать так:
$em->getRepository('Book')->createQuery();


В любом случае спасибо, я уже разобрался.


--------------------
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
PMПисьмо на e-mail пользователюICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темы Ответ в темуСоздание новой темыСоздание опроса