Collection.php 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. /**
  7. * Report Customers Review collection
  8. *
  9. * @author Magento Core Team <core@magentocommerce.com>
  10. */
  11. namespace Magento\Reports\Model\ResourceModel\Review\Customer;
  12. /**
  13. * @api
  14. * @since 100.0.2
  15. */
  16. class Collection extends \Magento\Review\Model\ResourceModel\Review\Collection
  17. {
  18. /**
  19. * @var \Magento\Customer\Model\ResourceModel\Customer
  20. */
  21. protected $_customerResource;
  22. /**
  23. * @param \Magento\Framework\Data\Collection\EntityFactory $entityFactory
  24. * @param \Psr\Log\LoggerInterface $logger
  25. * @param \Magento\Framework\Data\Collection\Db\FetchStrategyInterface $fetchStrategy
  26. * @param \Magento\Framework\Event\ManagerInterface $eventManager
  27. * @param \Magento\Review\Helper\Data $reviewData
  28. * @param \Magento\Review\Model\Rating\Option\VoteFactory $voteFactory
  29. * @param \Magento\Store\Model\StoreManagerInterface $storeManager
  30. * @param \Magento\Customer\Model\ResourceModel\Customer $customerResource
  31. * @param mixed $connection
  32. * @param \Magento\Framework\Model\ResourceModel\Db\AbstractDb $resource
  33. * @SuppressWarnings(PHPMD.ExcessiveParameterList)
  34. */
  35. public function __construct(
  36. \Magento\Framework\Data\Collection\EntityFactory $entityFactory,
  37. \Psr\Log\LoggerInterface $logger,
  38. \Magento\Framework\Data\Collection\Db\FetchStrategyInterface $fetchStrategy,
  39. \Magento\Framework\Event\ManagerInterface $eventManager,
  40. \Magento\Review\Helper\Data $reviewData,
  41. \Magento\Review\Model\Rating\Option\VoteFactory $voteFactory,
  42. \Magento\Store\Model\StoreManagerInterface $storeManager,
  43. \Magento\Customer\Model\ResourceModel\Customer $customerResource,
  44. \Magento\Framework\DB\Adapter\AdapterInterface $connection = null,
  45. \Magento\Framework\Model\ResourceModel\Db\AbstractDb $resource = null
  46. ) {
  47. $this->_customerResource = $customerResource;
  48. parent::__construct(
  49. $entityFactory,
  50. $logger,
  51. $fetchStrategy,
  52. $eventManager,
  53. $reviewData,
  54. $voteFactory,
  55. $storeManager,
  56. $connection,
  57. $resource
  58. );
  59. }
  60. /**
  61. * Init Select
  62. *
  63. * @return $this
  64. */
  65. protected function _initSelect()
  66. {
  67. parent::_initSelect();
  68. $this->_joinCustomers();
  69. return $this;
  70. }
  71. /**
  72. * Join customers
  73. *
  74. * @return $this
  75. */
  76. protected function _joinCustomers()
  77. {
  78. /** @var $connection \Magento\Framework\DB\Adapter\AdapterInterface */
  79. $connection = $this->getConnection();
  80. //Prepare fullname field result
  81. $customerFullname = $connection->getConcatSql(['customer.firstname', 'customer.lastname'], ' ');
  82. $this->getSelect()->reset(
  83. \Magento\Framework\DB\Select::COLUMNS
  84. )->joinInner(
  85. ['customer' => $this->getTable('customer_entity')],
  86. 'customer.entity_id = detail.customer_id',
  87. []
  88. )->columns(
  89. [
  90. 'customer_id' => 'detail.customer_id',
  91. 'customer_name' => $customerFullname,
  92. 'review_cnt' => 'COUNT(main_table.review_id)',
  93. ]
  94. )->group(
  95. 'detail.customer_id'
  96. );
  97. return $this;
  98. }
  99. /**
  100. * {@inheritdoc}
  101. *
  102. * Additional processing of 'customer_name' field is required, as it is a concat field, which can not be aliased.
  103. * @see _joinCustomers
  104. * @since 100.2.2
  105. */
  106. public function addFieldToFilter($field, $condition = null)
  107. {
  108. if ($field === 'customer_name') {
  109. $field = $this->getConnection()->getConcatSql(['customer.firstname', 'customer.lastname'], ' ');
  110. }
  111. return parent::addFieldToFilter($field, $condition);
  112. }
  113. /**
  114. * Get select count sql
  115. *
  116. * @return string
  117. */
  118. public function getSelectCountSql()
  119. {
  120. $countSelect = clone $this->getSelect();
  121. $countSelect->reset(\Magento\Framework\DB\Select::ORDER);
  122. $countSelect->reset(\Magento\Framework\DB\Select::GROUP);
  123. $countSelect->reset(\Magento\Framework\DB\Select::HAVING);
  124. $countSelect->reset(\Magento\Framework\DB\Select::LIMIT_COUNT);
  125. $countSelect->reset(\Magento\Framework\DB\Select::LIMIT_OFFSET);
  126. $countSelect->reset(\Magento\Framework\DB\Select::COLUMNS);
  127. $countSelect->reset(\Magento\Framework\DB\Select::WHERE);
  128. $countSelect->columns(new \Zend_Db_Expr('COUNT(DISTINCT detail.customer_id)'));
  129. return $countSelect;
  130. }
  131. }