ConcatExpression.php 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Framework\DB\Sql;
  7. use Magento\Framework\App\ResourceConnection;
  8. use Magento\Framework\DB\Adapter\AdapterInterface;
  9. /**
  10. * Class Concat
  11. */
  12. class ConcatExpression extends Expression
  13. {
  14. /**
  15. * @var AdapterInterface
  16. */
  17. protected $adapter;
  18. /**
  19. * @var string[]
  20. */
  21. protected $columns;
  22. /**
  23. * @var string
  24. */
  25. protected $separator;
  26. /**
  27. * @param ResourceConnection $resource
  28. * @param array $columns
  29. * @param string $separator
  30. */
  31. public function __construct(
  32. ResourceConnection $resource,
  33. array $columns,
  34. $separator = ' '
  35. ) {
  36. $this->adapter = $resource->getConnection();
  37. $this->columns = $columns;
  38. $this->separator = $separator;
  39. }
  40. /**
  41. * Returns SQL expression
  42. * TRIM(CONCAT_WS(separator, IF(str1 <> '', str1, NULL), IF(str2 <> '', str2, NULL) ...))
  43. *
  44. * @return string
  45. */
  46. public function __toString()
  47. {
  48. $columns = [];
  49. foreach ($this->columns as $key => $part) {
  50. if (isset($part['columnName']) && $part['columnName'] instanceof \Zend_Db_Expr) {
  51. $column = $part['columnName'];
  52. } else {
  53. $column = $this->adapter->quoteIdentifier(
  54. (isset($part['tableAlias']) ? $part['tableAlias'] . '.' : '')
  55. . (isset($part['columnName']) ? $part['columnName'] : $key)
  56. );
  57. }
  58. $columns[] = $this->adapter->getCheckSql($column . " <> ''", $column, 'NULL');
  59. }
  60. return sprintf(
  61. 'TRIM(%s)',
  62. $this->adapter->getConcatSql($columns, $this->separator)
  63. );
  64. }
  65. }