<?php
/**
* *
* * please don't remove this comment block
* *
* * @author phptricks Team - Mohammad Anzawi
* * @author_uri https://phptricks.org
* * @uri https://github.com/anzawi/php-database-class
* * @version 5.0.0
* * @licence MIT -> https://opensource.org/licenses/MIT
* * @package PHPtricks\Orm
*
*/
namespace PHPtricks\Orm\Relation;
use PHPtricks\Orm\Collection\Collection;
use PHPtricks\Orm\Model;
/**
* Trait RelationProvider
* @since Version 5.0.0
*
* @package PHPtricks\Orm\Relation
*/
trait RelationProvider
{
/**
* @var
*/
private $_relationModel;
/**
* @var
*/
private $_relationWithModel;
/**
* @var
*/
private $_joinType = '';
/**
* @var
*/
private $_allowedTyps = ['LEFT', 'RIGHT'];
/**
* @param Model $model
*
* @return $this
*/
protected function make(Model $model)
{
$this->_relationModel = $model;
return $this;
}
/**
* @param string $model
*
* @return $this
*/
protected function relatedWith(string $model) : RelationProvider
{
// create new object from model
$this->_relationWithModel = new $model();
return $this;
}
protected function join(string $type = '') : RelationProvider
{
// empty $type main cross join
$this->_joinType = strtoupper($type);
if( !in_array($type, $this->_allowedTyps) ) {
$this->_joinType = "";
}
return $this;
}
protected function outer()
{
$this->_joinType .= ' OUTER';
}
/**
* @param string $foreignId
* @param string|null $id
*
* @return PHPtricks\Orm\Collection\Collection
*/
protected function on(string $foreignId, string $id = null) : Collection
{
if ($id === null) {
$id = $this->_relationModel->id();
}
$stmt = "SELECT * FROM {$this->_relationWithModel->table()} as main
{$this->_joinType} JOIN {$this->_relationModel->table()} as other
ON(main.{$id} = other.{$foreignId}){$this->getQueryAdditions()}";
return $this->collection([
'results' => $this->query($stmt)->results(),
'table' => null,
'id' => null,
]);
}
protected function fullOuterJoinOn(string $foreignId, string $id = null) : Collection
{
if ($id === null) {
$id = $this->_relationModel->id();
}
$stmt = "SELECT * FROM {$this->_relationWithModel->table()} as main
LEFT OUTER JOIN {$this->_relationModel->table()} as other
ON(main.{$id} = other.{$foreignId}){$this->getQueryAdditions()}
UNION
SELECT * FROM {$this->_relationWithModel->table()} as main
RIGHT OUTER JOIN {$this->_relationModel->table()} as other
ON(main.{$id} = other.{$foreignId}){$this->getQueryAdditions()}
";
return $this->collection([
'results' => $this->query($stmt)->results(),
'table' => null,
'id' => null,
]);
}
}
|