123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- <?php
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- namespace Magento\Framework\DB\Sql;
- use Magento\Framework\App\ResourceConnection;
- use Magento\Framework\DB\Adapter\AdapterInterface;
- use Magento\Framework\DB\Select;
- /**
- * Class LookupExpression
- */
- class LookupExpression extends Expression
- {
- /**
- * @var Resource
- */
- protected $resource;
- /**
- * @var AdapterInterface
- */
- protected $adapter;
- /**
- * @var string
- */
- protected $targetColumn;
- /**
- * @var string
- */
- protected $targetTable;
- /**
- * @var array
- */
- protected $referenceColumns;
- /**
- * @var array
- */
- protected $sortOrder;
- /**
- * @param ResourceConnection $resource
- * @param string $targetColumn
- * @param string $targetTable
- * @param array $referenceColumns
- * @param array $sortOrder
- */
- public function __construct(
- ResourceConnection $resource,
- $targetColumn,
- $targetTable,
- array $referenceColumns = [],
- array $sortOrder = []
- ) {
- $this->targetTable = $targetTable;
- $this->targetColumn = $targetColumn;
- $this->referenceColumns = $referenceColumns;
- $this->sortOrder = $sortOrder;
- $this->resource = $resource;
- $this->adapter = $this->resource->getConnection();
- }
- /**
- * Process WHERE clause
- *
- * @param Select $select
- * @return void
- */
- protected function processWhereCondition(Select $select)
- {
- foreach ($this->referenceColumns as $column => $referenceColumn) {
- $identifier = '';
- if (isset($referenceColumn['tableAlias'])) {
- $identifier = $referenceColumn['tableAlias'] . '.';
- }
- $columnName = $column;
- if (isset($referenceColumn['columnName'])) {
- $columnName = $referenceColumn['columnName'];
- }
- $select->where(
- sprintf(
- '%s = %s',
- $this->adapter->quoteIdentifier('lookup.' . $column),
- $this->adapter->quoteIdentifier($identifier . $columnName)
- )
- );
- }
- }
- /**
- * Process ORDER BY clause
- *
- * @param Select $select
- * @return void
- */
- protected function processSortOrder(Select $select)
- {
- foreach ($this->sortOrder as $direction => $column) {
- if (!in_array($direction, [Select::SQL_ASC, Select::SQL_DESC])) {
- $direction = '';
- }
- $expr = new \Zend_Db_Expr(
- sprintf(
- '%s %s',
- $this->adapter->quoteIdentifier('lookup.' . $column),
- $direction
- )
- );
- $select->order($expr);
- }
- }
- /**
- * Returns lookup SQL
- *
- * @return string
- */
- public function __toString()
- {
- $select = $this->adapter->select()
- ->from(['lookup' => $this->resource->getTableName($this->targetTable)], [$this->targetColumn])
- ->limit(1);
- $this->processWhereCondition($select);
- $this->processSortOrder($select);
- return sprintf('(%s)', $select->assemble());
- }
- }
|