Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
Collection.php
Go to the documentation of this file.
1 <?php
11 
17 class Collection extends \Magento\Customer\Model\ResourceModel\Customer\Collection
18 {
24  protected $_addOrderStatistics = false;
25 
31  protected $_addOrderStatFilter = false;
32 
39 
46 
52  protected $_orderEntityTable;
53 
59  protected $_orderEntityField;
60 
64  protected $quoteRepository;
65 
69  protected $_quoteItemFactory;
70 
74  protected $orderResource;
75 
96  public function __construct(
97  \Magento\Framework\Data\Collection\EntityFactory $entityFactory,
98  \Psr\Log\LoggerInterface $logger,
99  \Magento\Framework\Data\Collection\Db\FetchStrategyInterface $fetchStrategy,
100  \Magento\Framework\Event\ManagerInterface $eventManager,
101  \Magento\Eav\Model\Config $eavConfig,
102  \Magento\Framework\App\ResourceConnection $resource,
103  \Magento\Eav\Model\EntityFactory $eavEntityFactory,
104  \Magento\Eav\Model\ResourceModel\Helper $resourceHelper,
105  \Magento\Framework\Validator\UniversalFactory $universalFactory,
106  \Magento\Framework\Model\ResourceModel\Db\VersionControl\Snapshot $entitySnapshot,
107  \Magento\Framework\DataObject\Copy\Config $fieldsetConfig,
108  \Magento\Quote\Api\CartRepositoryInterface $quoteRepository,
109  \Magento\Quote\Model\ResourceModel\Quote\Item\CollectionFactory $quoteItemFactory,
110  \Magento\Sales\Model\ResourceModel\Order\Collection $orderResource,
111  \Magento\Framework\DB\Adapter\AdapterInterface $connection = null,
112  $modelName = self::CUSTOMER_MODEL_NAME
113  ) {
114  parent::__construct(
115  $entityFactory,
116  $logger,
117  $fetchStrategy,
118  $eventManager,
119  $eavConfig,
120  $resource,
121  $eavEntityFactory,
122  $resourceHelper,
123  $universalFactory,
125  $fieldsetConfig,
126  $connection,
127  $modelName
128  );
129  $this->orderResource = $orderResource;
130  $this->quoteRepository = $quoteRepository;
131  $this->_quoteItemFactory = $quoteItemFactory;
132  }
133 
139  public function addCartInfo()
140  {
141  foreach ($this->getItems() as $item) {
142  try {
143  $quote = $this->quoteRepository->getForCustomer($item->getId());
144 
145  $totals = $quote->getTotals();
146  $item->setTotal($totals['subtotal']->getValue());
147  $quoteItems = $this->_quoteItemFactory->create()->setQuoteFilter($quote->getId());
148  $quoteItems->load();
149  $item->setItems($quoteItems->count());
150  } catch (\Magento\Framework\Exception\NoSuchEntityException $e) {
151  $item->remove();
152  }
153  }
154  return $this;
155  }
156 
162  public function addCustomerName()
163  {
164  $this->addNameToSelect();
165  return $this;
166  }
167 
174  public function addOrdersStatistics($isFilter = false)
175  {
176  $this->_addOrderStatistics = true;
177  $this->_addOrderStatFilter = (bool)$isFilter;
178  return $this;
179  }
180 
186  protected function _addOrdersStatistics()
187  {
188  $customerIds = $this->getColumnValues($this->getResource()->getIdFieldName());
189 
190  if ($this->_addOrderStatistics && !empty($customerIds)) {
191  $connection = $this->orderResource->getConnection();
192  $baseSubtotalRefunded = $connection->getIfNullSql('orders.base_subtotal_refunded', 0);
193  $baseSubtotalCanceled = $connection->getIfNullSql('orders.base_subtotal_canceled', 0);
194  $baseDiscountCanceled = $connection->getIfNullSql('orders.base_discount_canceled', 0);
195 
196  $totalExpr = $this->_addOrderStatFilter ?
197  "(orders.base_subtotal-{$baseSubtotalCanceled}-{$baseSubtotalRefunded} - {$baseDiscountCanceled}"
198  . " - ABS(orders.base_discount_amount))*orders.base_to_global_rate" :
199  "orders.base_subtotal-{$baseSubtotalCanceled}-{$baseSubtotalRefunded} - {$baseDiscountCanceled}"
200  . " - ABS(orders.base_discount_amount)";
201 
202  $select = $this->orderResource->getConnection()->select();
203  $select->from(
204  ['orders' => $this->orderResource->getTable('sales_order')],
205  [
206  'orders_avg_amount' => "AVG({$totalExpr})",
207  'orders_sum_amount' => "SUM({$totalExpr})",
208  'orders_count' => 'COUNT(orders.entity_id)',
209  'customer_id'
210  ]
211  )->where(
212  'orders.state <> ?',
213  \Magento\Sales\Model\Order::STATE_CANCELED
214  )->where(
215  'orders.customer_id IN(?)',
216  $customerIds
217  )->group(
218  'orders.customer_id'
219  );
220 
221  foreach ($this->orderResource->getConnection()->fetchAll($select) as $ordersInfo) {
222  $this->getItemById($ordersInfo['customer_id'])->addData($ordersInfo);
223  }
224  }
225 
226  return $this;
227  }
228 
234  protected function _afterLoad()
235  {
236  $this->_addOrdersStatistics();
237  return $this;
238  }
239 
246  public function orderByCustomerRegistration($dir = self::SORT_ORDER_DESC)
247  {
248  $this->addAttributeToSort('entity_id', $dir);
249  return $this;
250  }
251 
257  public function getSelectCountSql()
258  {
259  $countSelect = clone $this->getSelect();
260  $countSelect->reset(\Magento\Framework\DB\Select::ORDER);
261  $countSelect->reset(\Magento\Framework\DB\Select::LIMIT_COUNT);
262  $countSelect->reset(\Magento\Framework\DB\Select::LIMIT_OFFSET);
263  $countSelect->reset(\Magento\Framework\DB\Select::COLUMNS);
264  $countSelect->reset(\Magento\Framework\DB\Select::GROUP);
265  $countSelect->reset(\Magento\Framework\DB\Select::HAVING);
266  $countSelect->columns("count(DISTINCT e.entity_id)");
267 
268  return $countSelect;
269  }
270 }
__construct(\Magento\Framework\Data\Collection\EntityFactory $entityFactory, \Psr\Log\LoggerInterface $logger, \Magento\Framework\Data\Collection\Db\FetchStrategyInterface $fetchStrategy, \Magento\Framework\Event\ManagerInterface $eventManager, \Magento\Eav\Model\Config $eavConfig, \Magento\Framework\App\ResourceConnection $resource, \Magento\Eav\Model\EntityFactory $eavEntityFactory, \Magento\Eav\Model\ResourceModel\Helper $resourceHelper, \Magento\Framework\Validator\UniversalFactory $universalFactory, \Magento\Framework\Model\ResourceModel\Db\VersionControl\Snapshot $entitySnapshot, \Magento\Framework\DataObject\Copy\Config $fieldsetConfig, \Magento\Quote\Api\CartRepositoryInterface $quoteRepository, \Magento\Quote\Model\ResourceModel\Quote\Item\CollectionFactory $quoteItemFactory, \Magento\Sales\Model\ResourceModel\Order\Collection $orderResource, \Magento\Framework\DB\Adapter\AdapterInterface $connection=null, $modelName=self::CUSTOMER_MODEL_NAME)
Definition: Collection.php:96
$quote
$resource
Definition: bulk.php:12
$logger
$totals
Definition: totalbar.phtml:10
addAttributeToSort($attribute, $dir=self::SORT_ORDER_ASC)
$connection
Definition: bulk.php:13