Zum Inhalt springen

UNION SELECT

Erstellt am 15. Januar 2018 · 2 Antworten · letzte Antwort am 29. Januar 2018

Tags: TYPO3 8, Frage

getit ·

Ich möchte gerne in einem Aufwasch auf zwei Tabellen zugreifen.

Ich dach das kann ich mit einem UNION SELECT machen:

public function customQuery() {
  $query = $this->createQuery();
  $query->statement('SELECT uid, null, bezeichnung FROM tx_kkbaybw_domain_model_gebaeude UNION ALL SELECT uid, vorname, nachname FROM tx_kkbaybw_domain_model_ansprechpartner');
  return $query->execute();
}

im setup.ts

KKSoftware\Kkbaybw\Domain\Model\FeSearch {
  mapping {
    tableName = tx_kkbaybw_domain_model_gebaeude
  }
}
<?php

namespace KKSoftware\Kkbaybw\Domain\Model;

use TYPO3\CMS\Extbase\DomainObject\AbstractEntity;

class FeSearch extends AbstractEntity {
  /**
   * bezeichnung
   *
   * @var string
   */
  protected $bezeichnung = '';

  /**
   * @var string
   */
  protected $vorname = '';

  /**
   * Returns the bezeichnung
   *
   * @return string $bezeichnung
   */
  public function getBezeichnung() {
    return $this->bezeichnung;
  }

  /**
   * @return string
   */
  public function getVorname() {
    return $this->vorname;
  }
}

Wenn ich die customQuery() ausführe bekomme ich eine ResultSet mit der richtigen Anzahl von Einträgen.
Nur sind die Einträge für den zweiten Teil des UNIONs (SELECT ... ansprechpartner) leer.

Ausgabe des DebuggerUtility:

TYPO3\CMS\Extbase\...\QueryResult {
  0 => + KKSoftware\Kkbaybw\Domain\Model\FeSearch (uid=1, pid=0)
  1 => + ...FeSearch (uid=2, pid=0)
  ...
  17 => KKSoftware\Kkbaybw\Domain\Model\FeSearch 'see above' (uid=1, pid=0)
  ...
  21 => ... FeSearch 'see above'(uid=6, pid=0)
}

Die Schlüssel 0-16 kommen aus dem ersten Teil des UNIONs und sind mit einem '+' markiert - d.h. da ist ein Objekt darunter.
Die Schlüssel 17-21 kommen aus dem zweiten Teil des UNIONS sind leer.

getit ·

Ich habs.

Direkt in der Datenbank (geht nicht über ext_tables.sql) den VIEW erzeugt:

select (`tx_xxx_domain_model_gebaeude`.`uid` + 100000) AS `uid`,`tx_xxx_domain_model_gebaeude`.`bezeichnung` AS `name`,'' AS `vorname`,'' AS `nachname`,concat(`tx_xxx_domain_model_gebaeude`.`telefon_landvorwahl`,' ',`tx_xxx_domain_model_gebaeude`.`telefon_ortsvorwahl`,' ',`tx_xxx_domain_model_gebaeude`.`telefon_durchwahl`) AS `telefon`,concat(`tx_xxx_domain_model_gebaeude`.`fax_landvorwahl`,' ',`tx_xxx_domain_model_gebaeude`.`fax_ortsvorwahl`,' ',`tx_xxx_domain_model_gebaeude`.`fax_durchwahl`) AS `fax`,'' AS `email`,'' AS `mobile`,'' AS `sprechzeiten_nach_vereinbarung`,'' AS `sprechzeiten_sonderzeiten`,`tx_xxx_domain_model_gebaeude`.`oeffnungszeit_nach_vereinbarung` AS `oeffnungszeit_nach_vereinbarung`,`tx_xxx_domain_model_gebaeude`.`oeffnungszeit_sonderzeiten` AS `oeffnungszeit_sonderzeiten`,concat(`tx_xxx_domain_model_gebaeude`.`oeffnungszeit_mo_von_vormittags`,' - ',`tx_xxx_domain_model_gebaeude`.`oeffnungszeit_mo_bis_vormittags`) AS `oeffnungszeit_mo_vormittags`,concat(`tx_xxx_domain_model_gebaeude`.`oeffnungszeit_mo_von_nachmittags`,' - ',`tx_xxx_domain_model_gebaeude`.`oeffnungszeit_mo_bis_nachmittags`) AS `oeffnungszeit_mo_nachmittags`,concat(`tx_xxx_domain_model_gebaeude`.`oeffnungszeit_di_von_vormittags`,' - ',`tx_xxx_domain_model_gebaeude`.`oeffnungszeit_di_bis_vormittags`) AS `oeffnungszeit_di_vormittags`,concat(`tx_xxx_domain_model_gebaeude`.`oeffnungszeit_di_von_nachmittags`,' - ',`tx_xxx_domain_model_gebaeude`.`oeffnungszeit_di_bis_nachmittags`) AS `oeffnungszeit_di_nachmittags`,concat(`tx_xxx_domain_model_gebaeude`.`oeffnungszeit_mi_von_vormittags`,' -',`tx_xxx_domain_model_gebaeude`.`oeffnungszeit_mi_bis_vormittags`) AS `oeffnungszeit_mi_vormittags`,concat(`tx_xxx_domain_model_gebaeude`.`oeffnungszeit_mi_von_nachmittags`,' - ',`tx_xxx_domain_model_gebaeude`.`oeffnungszeit_mi_bis_nachmittags`) AS `oeffnungszeit_mi_nachmittags`,concat(`tx_xxx_domain_model_gebaeude`.`oeffnungszeit_do_von_vormittags`,' _ ',`tx_xxx_domain_model_gebaeude`.`oeffnungszeit_do_bis_vormittags`) AS `oeffnungszeit_do_vormittags`,concat(`tx_xxx_domain_model_gebaeude`.`oeffnungszeit_do_von_nachmittags`,' - ',`tx_xxx_domain_model_gebaeude`.`oeffnungszeit_do_bis_nachmittags`) AS `oeffnungszeit_do_nachmittags`,concat(`tx_xxx_domain_model_gebaeude`.`oeffnungszeit_fr_von_vormittags`,' - ',`tx_xxx_domain_model_gebaeude`.`oeffnungszeit_fr_bis_vormittags`) AS `oeffnungszeit_fr_vormittags`,concat(`tx_xxx_domain_model_gebaeude`.`oeffnungszeit_fr_von_nachmittags`,' - ',`tx_xxx_domain_model_gebaeude`.`oeffnungszeit_fr_bis_nachmittags`) AS `oeffnungszeit_fr_nachmittags`,'gebaeude' AS `typ`,'' AS `gebaeude`,'' AS `behoerde` from `tx_xxx_domain_model_gebaeude` union all select `tx_xxx_domain_model_ansprechpartner`.`uid` AS `uid`,concat(`tx_xxx_domain_model_ansprechpartner`.`vorname`,' ',`tx_xxx_domain_model_ansprechpartner`.`nachname`) AS `name`,`tx_xxx_domain_model_ansprechpartner`.`vorname` AS `vorname`,`tx_xxx_domain_model_ansprechpartner`.`nachname` AS `nachname`,concat(`tx_xxx_domain_model_ansprechpartner`.`telefon_landvorwahl`,' ',`tx_xxx_domain_model_ansprechpartner`.`telefon_ortsvorwahl`,' ',`tx_xxx_domain_model_ansprechpartner`.`telefon_durchwahl`) AS `telefon`,concat(`tx_xxx_domain_model_ansprechpartner`.`fax_landvorwahl`,' ',`tx_xxx_domain_model_ansprechpartner`.`fax_ortsvorwahl`,' ',`tx_xxx_domain_model_ansprechpartner`.`fax_durchwahl`) AS `fax`,concat(`tx_xxx_domain_model_ansprechpartner`.`mobil_landvorwahl`,' ',`tx_xxx_domain_model_ansprechpartner`.`mobil_ortsvorwahl`,' ',`tx_xxx_domain_model_ansprechpartner`.`mobil_durchwahl`) AS `mobile`,`tx_xxx_domain_model_ansprechpartner`.`email` AS `email`,`tx_xxx_domain_model_ansprechpartner`.`sprechzeiten_nach_vereinbarung` AS `sprechzeiten_nach_vereinbarung`,`tx_xxx_domain_model_ansprechpartner`.`sprechzeiten_sonderzeiten` AS `sprechzeiten_sonderzeiten`,'' AS `oeffnungszeit_nach_vereinbarung`,'' AS `oeffnungszeit_sonderzeiten`,'' AS `oeffnungszeit_mo_vormittags`,'' AS `oeffnungszeit_mo_nachmittags`,'' AS `oeffnungszeit_di_vormittags`,'' AS `oeffnungszeit_di_nachmittags`,'' AS `oeffnungszeit_mi_vormittags`,'' AS `oeffnungszeit_mi_nachmittags`,'' AS `oeffnungszeit_do_vormittags`,'' AS `oeffnungszeit_do_nachmittags`,'' AS `oeffnungszeit_fr_vormittags`,'' AS `oeffnungszeit_fr_nachmittags`,'ansprechpartner' AS `typ`,`tx_xxx_domain_model_ansprechpartner`.`gebaeude_id` AS `gebaeude`,`tx_xxx_domain_model_ansprechpartner`.`ansprechpartner_behoerde` AS `behoerde` from `tx_xxx_domain_model_ansprechpartner`

Dann habe ich dazu ein Model angelegt:

<?php

namespace KKSoftware\XXX\Domain\Model;

class FeSearch extends BaseModel {

	/**
	 * @var string
	 */
	protected $name;

	/**
	 * @var string
	 */
	protected $vorname;

	/**
	 * @var string
	 */
	protected $nachname;

	/**
	 * @var string
	 */
	protected $telefon;

	/**
	 * @var string
	 */
	protected $fax;

	/**
	 * @var string
	 */
	protected $mobile;

	/**
	 * @var int
	 */
	protected $sprechzeitenNachVereinbarung;

	/**
	 * @var string
	 */
	protected $sprechzeitenSonderzeiten;

	/**
	 * @var int
	 */
	protected $oeffnungszeitNachVereinbarung;

	/**
	 * @var string
	 */
	protected $oeffnungszeitSonderzeiten;

	/**
	 * @var string
	 */
	protected $email;

	/**
	 * @var string
	 */
	protected $oeffnungszeitMoVormittags;

	/**
	 * @var string
	 */
	protected $oeffnungszeitMoNachmittags;

	/**
	 * @var string
	 */
	protected $oeffnungszeitDiVormittags;

	/**
	 * @var string
	 */
	protected $oeffnungszeitDiNachmittags;

	/**
	 * @var string
	 */
	protected $oeffnungszeitMiVormittags;

	/**
	 * @var string
	 */
	protected $oeffnungszeitMiNachmittags;

	/**
	 * @var string
	 */
	protected $oeffnungszeitDoVormittags;

	/**
	 * @var string
	 */
	protected $oeffnungszeitDoNachmittags;

	/**
	 * @var string
	 */
	protected $oeffnungszeitFrVormittags;

	/**
	 * @var string
	 */
	protected $oeffnungszeitFrNachmittags;

	/**
	 * @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\KKSoftware\XXX\Domain\Model\Gebaeude>
	 */
	protected $gebaeude;

	/**
	 * @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\KKSoftware\XXX\Domain\Model\Behoerde>
	 */
	protected $behoerde;

	/**
	 * @return string
	 */
	public function getName() {
		return $this->name;
	}

	/**
	 * @return string
	 */
	public function getVorname() {
		return $this->vorname;
	}

	/**
	 * @return string
	 */
	public function getNachname() {
		return $this->nachname;
	}

	/**
	 * @return string
	 */
	public function getTelefon() {
		return $this->telefon;
	}

	/**
	 * @return string
	 */
	public function getFax() {
		return $this->fax;
	}

	/**
	 * @return string
	 */
	public function getMobile() {
		return $this->mobile;
	}

	/**
	 * @return string
	 */
	public function getEmail() {
		return $this->email;
	}

	/**
	 * @return int
	 */
	public function getSprechzeitenNachVereinbarung() {
		return $this->sprechzeitenNachVereinbarung;
	}

	/**
	 * @return string
	 */
	public function getSprechzeitenSonderzeiten() {
		return $this->sprechzeitenSonderzeiten;
	}

	/**
	 * @return int
	 */
	public function getOeffnungszeitNachVereinbarung() {
		return $this->oeffnungszeitNachVereinbarung;
	}

	/**
	 * @return string
	 */
	public function getOeffnungszeitSonderzeiten() {
		return $this->oeffnungszeitSonderzeiten;
	}

	/**
	 * @return string
	 */
	public function getOeffnungszeitMoVormittags() {
		return $this->oeffnungszeitMoVormittags;
	}

	/**
	 * @return string
	 */
	public function getOeffnungszeitMoNachmittags() {
		return $this->oeffnungszeitMoNachmittags;
	}

	/**
	 * @return string
	 */
	public function getOeffnungszeitDiVormittags() {
		return $this->oeffnungszeitDiVormittags;
	}

	/**
	 * @return string
	 */
	public function getOeffnungszeitDiNachmittags() {
		return $this->oeffnungszeitDiNachmittags;
	}

	/**
	 * @return string
	 */
	public function getOeffnungszeitMiVormittags() {
		return $this->oeffnungszeitMiVormittags;
	}

	/**
	 * @return string
	 */
	public function getOeffnungszeitMiNachmittags() {
		return $this->oeffnungszeitMiNachmittags;
	}

	/**
	 * @return string
	 */
	public function getOeffnungszeitDoVormittags() {
		return $this->oeffnungszeitDoVormittags;
	}

	/**
	 * @return string
	 */
	public function getOeffnungszeitDoNachmittags() {
		return $this->oeffnungszeitDoNachmittags;
	}

	/**
	 * @return string
	 */
	public function getOeffnungszeitFrVormittags() {
		return $this->oeffnungszeitFrVormittags;
	}

	/**
	 * @return string
	 */
	public function getOeffnungszeitFrNachmittags() {
		return $this->oeffnungszeitFrNachmittags;
	}

	/**
	 * @return \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\KKSoftware\XXX\Domain\Model\Gebaeude>
	 */
	public function getGebaeude() {
		return $this->gebaeude;
	}

	/**
	 * @return \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\KKSoftware\XXX\Domain\Model\Behoerde>
	 */
	public function getBehoerde() {
		return $this->behoerde;
	}
}

Und ein (leeres) Repository.

Anschließend kann ich mit

$feSearchRepository = $this->objectManager->get('KKSoftware\\XXX\\Domain\\Repository\\FeSearchRepository');
$result = $feSearchRepository->findAll();
\TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump($result);exit;

mein VIEW abfragen.