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

> Doctrine targetEntity abstract class
sNICkerssss  
 ۩  Дата
Цитировать сообщение

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



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 13
Пользователь №: 19806
На форуме: 7 лет, 12 дней
Карма:




Doctrine-а выполняет лишние запросы, когда в entity прописана связь ManyToOne к абстрактному классу. Моя структура классов:
/**
* @ORM\Entity
* @ORM\Table(name="tb_payment_info")
* @ORM\InheritanceType("JOINED")
* @ORM\DiscriminatorColumn(name="type", type="integer")
* @ORM\DiscriminatorMap({
* "0" = "PaymentInfoPaypal",
* "1" = "PaymentInfoSkrill",
* })
*/
abstract class AbstractPaymentInfo
{
/**
* @ORM\Column(name="payment_info_id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
}

/**
* @ORM\Entity
* @ORM\Table(name="tb_payment_info_paypal")
*/
class PaymentInfoPaypal extends AbstractPaymentInfo
{
}

/**
* @ORM\Entity
* @ORM\Table(name="tb_payment_info_skrill")
*/
class PaymentInfoSkrill extends AbstractPaymentInfo
{
}

Мой Payout класс содержит колонку payment_info_id, значения которой берутся из таблицы tb_payment_info (общей для PaymentInfoPaypal и PaymentInfoSkrill):

/**
* @ORM\Entity
* @ORM\Table(name="tb_payout")
*/
class Payout
{
/**
* @var AbstractPaymentInfo
*
* @ORM\ManyToOne(targetEntity="AbstractPaymentInfo")
* @ORM\JoinColumn(name="payment_info_id", referencedColumnName="payment_info_id")
*/
private $paymentInfo;
}

Когда я пытаюсь получить любой Payout entity, его paymentInfo автоматически инициализируется с помощью отдельных запросов, которые следуют сразу после основного запроса:
$this->getEntityManager()->getRepository('TuoPayBundle:Payout')->find(255);

Получаю 2 запроса к базе: первый для Payout и второй для его paymentInfo
$this->getEntityManager()->getRepository('TuoPayBundle:Payout')->findBy(['id'=>[255,256] ]);

Получаю 3 запроса: первый для Payout а второй и третий для инициализации paymentInfo

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

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



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

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 4256
Пользователь №: 29002
На форуме: 5 лет, 4 месяца, 2 дня
Карма: 147




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

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



Лысый и злой
******

Профиль
Журнал
Группа: ★ЛжеЭксперт★
Завсегдатай форума
Сообщений: 25980
Пользователь №: 21350
На форуме: 6 лет, 8 месяцев, 18 дней
Карма: 725

Не курю:
1 год, 2 месяца, 5 дней


Цитата
напиши чистый нужный SQL. ох уж эти абстракции...

нафига, ему видимо объекты нужны, раз он ОРМ выбрал.


--------------------
Халявные ответы кончились.
Если нужен готовый код - готовьтесь заплатить.
Райкин тоже был артист

Возле дома был сарай
А когда всё хорошо
Можно просто покурить

user posted image
http://ufa102.xyz/
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
sNICkerssss  
 ۩  Дата
Цитировать сообщение

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



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 13
Пользователь №: 19806
На форуме: 7 лет, 12 дней
Карма:




Цитата (redreem @ 22.12.2015 - 01:04)
напиши чистый нужный SQL. ох уж эти абстракции...

1) Вариант, если джойним не сразу. Это как хочется чтобы работало).
$payout = $this->getEntityManager()->getRepository('TuoPayBundle:Payout')->find(255);

select * from tb_payout 
where id = 255

Lazy load:
$paymentInfo = $payout->getPaymnentInfo();

select * from tb_payment_info t0
left join tb_payment_info_paypal t1 ON t0.payment_info_id = t1.payment_info_id
left join tb_payment_info_skrill t2 ON t0.payment_info_id = t2.payment_info_id
where t0.payment_info_id = 33

Запрос выше - этот как раз лишний, который не по моей воле выполняется сейчас сам, когда делаю выборку Payout-ов

2) Вариант, если джойним сразу. Но этот вариант практически никогда не нужен. Джойн не маленький (в посте приведен пример не со всеми платежными системами) и само paymentInfo не всегда нужно.

$this->getEntityManager()->getRepository('TuoPayBundle:Payout')->createQueryBuilder('p')
->select('p', 'pi')
->join('p.paymentInfo', 'pi')
->where('p.id = 255')
->getQuery()
->getResult();



select * from tb_payout t0
left join tb_payment_info t1 ON t0.payment_info_id = t1.payment_info_id
left join tb_payment_info_paypal t2 ON t0.payment_info_id = t2.payment_info_id
left join tb_payment_info_skrill t3 ON t0.payment_info_id = t3.payment_info_id
where t0.id = 255
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

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

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