Relaciones
This commit is contained in:
@ -7,7 +7,7 @@ use \Model as BaseModel;
|
|||||||
use Aldarien\Common\Definition\Model as ModelInterface;
|
use Aldarien\Common\Definition\Model as ModelInterface;
|
||||||
use Aldarien\Common\Factory\Model as ModelFactory;
|
use Aldarien\Common\Factory\Model as ModelFactory;
|
||||||
|
|
||||||
class Model extends BaseModel implements ModelInterface {
|
abstract class Model extends BaseModel implements ModelInterface {
|
||||||
const CHILD_KEY = 'child_key';
|
const CHILD_KEY = 'child_key';
|
||||||
const PARENT_KEY = 'parent_key';
|
const PARENT_KEY = 'parent_key';
|
||||||
const SELF_KEY = 'self_key';
|
const SELF_KEY = 'self_key';
|
||||||
|
54
src/RelationNode.php
Normal file
54
src/RelationNode.php
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
<?php
|
||||||
|
namespace Aldarien\Models;
|
||||||
|
|
||||||
|
use Aldarien\Common\Factory\Model as ModelFactory;
|
||||||
|
use Aldarien\Common\Alias\Model;
|
||||||
|
|
||||||
|
class RelationNode {
|
||||||
|
protected $source;
|
||||||
|
protected $destination;
|
||||||
|
protected $join;
|
||||||
|
protected $relation;
|
||||||
|
|
||||||
|
public function __construct() {
|
||||||
|
$this->join = 'join';
|
||||||
|
$this->relation = '=';
|
||||||
|
}
|
||||||
|
public function setSource(string $class_name, string $key): RelationNode {
|
||||||
|
return $this->set('source', $class_name, $key);
|
||||||
|
}
|
||||||
|
public function setDestination(string $class_name, string $key): RelationNode {
|
||||||
|
return $this->set('destination', $class_name, $key);
|
||||||
|
}
|
||||||
|
public function setJoin(string $join): RelationNode {
|
||||||
|
$valid = ['join', 'inner join', 'outer join', 'left join', 'left outer join', 'right join', 'right outer join'];
|
||||||
|
if (\array_search(strtolower($join), $valid) !== false) {
|
||||||
|
$this->join = strtolower($join);
|
||||||
|
}
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
public function setRelation(string $relation): RelationNode {
|
||||||
|
$valid = ['=', '<=', '<', '>=', '>', 'like'];
|
||||||
|
if (\array_search(strtolower($relation), $valid) !== false) {
|
||||||
|
$this->relation = $relation;
|
||||||
|
}
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function set(string $type, string $class_name, string $key): RelationNode {
|
||||||
|
$this->$type = (object) [
|
||||||
|
'class' => $class_name,
|
||||||
|
'table' => Model::getTable($class_name),
|
||||||
|
'key' => $key
|
||||||
|
];
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function build(ModelFactory $factory): ModelFactory {
|
||||||
|
$source = implode('.', [$this->source->table, $this->source->key]);
|
||||||
|
$destination = implode('.', [$this->destination->table, $this->destination->key]);
|
||||||
|
$method = str_replace([' '], ['_'], strtolower($this->join));
|
||||||
|
$output = $factory->{$method}([$this->destination->table, [$destination, $source, $this->relation]]);
|
||||||
|
return $output;
|
||||||
|
}
|
||||||
|
}
|
33
src/Relationship.php
Normal file
33
src/Relationship.php
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
<?php
|
||||||
|
namespace Aldarien\Models;
|
||||||
|
|
||||||
|
use Aldarien\Common\Factory\Model as ModelFactory;
|
||||||
|
use Aldarien\Common\Alias\Model;
|
||||||
|
|
||||||
|
class Relationship {
|
||||||
|
protected $start;
|
||||||
|
protected $nodes;
|
||||||
|
|
||||||
|
public function __construct(string $class_name) {
|
||||||
|
$this->setStart($class_name);
|
||||||
|
}
|
||||||
|
public function setStart(string $class_name) {
|
||||||
|
$this->start = (object) [
|
||||||
|
'class' => $class_name,
|
||||||
|
'table' => Model::getTable($class_name)
|
||||||
|
];
|
||||||
|
}
|
||||||
|
public function addNode(RelationNode $node) {
|
||||||
|
if ($this->nodes === null) {
|
||||||
|
$this->nodes = [];
|
||||||
|
}
|
||||||
|
$this->nodes []= $node;
|
||||||
|
}
|
||||||
|
public function build(ModelFactory $factory): ModelFactory {
|
||||||
|
$output = $factory->find($this->start->class);
|
||||||
|
foreach ($this->nodes as $node) {
|
||||||
|
$output = $node->build($factory);
|
||||||
|
}
|
||||||
|
return $output;
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user