Bluz\Db\Relations::findRelations PHP Method

findRelations() public static method

Find Relations between two tables
public static findRelations ( string $modelOne, string $modelTwo, array $keys ) : array
$modelOne string Table
$modelTwo string Target table
$keys array Keys from first table
return array
    public static function findRelations($modelOne, $modelTwo, $keys)
    {
        $keys = (array) $keys;
        if (!($relations = self::getRelations($modelOne, $modelTwo))) {
            throw new RelationNotFoundException("Relations between model `{$modelOne}` and `{$modelTwo}` is not defined");
        }
        /* @var Table $tableOneClass name */
        $tableOneClass = self::getModelClass($modelOne);
        /* @var string $tableOneName */
        $tableOneName = $tableOneClass::getInstance()->getName();
        /* @var Table $tableTwoClass name */
        $tableTwoClass = self::getModelClass($modelTwo);
        /* @var string $tableTwoName */
        $tableTwoName = $tableTwoClass::getInstance()->getName();
        /* @var Query\Select $tableTwoSelect */
        $tableTwoSelect = $tableTwoClass::getInstance()->select();
        // check many to many relation
        if (is_int(array_keys($relations)[0])) {
            // many to many relation over third table
            $modelThree = $relations[0];
            // relations between target table and third table
            $relations = self::getRelations($modelTwo, $modelThree);
            /* @var Table $tableThreeClass name */
            $tableThreeClass = self::getModelClass($modelThree);
            /* @var string $tableTwoName */
            $tableThreeName = $tableThreeClass::getInstance()->getName();
            // join it to query
            $tableTwoSelect->join($tableTwoName, $tableThreeName, $tableThreeName, $tableTwoName . '.' . $relations[$modelTwo] . '=' . $tableThreeName . '.' . $relations[$modelThree]);
            // relations between source table and third table
            $relations = self::getRelations($modelOne, $modelThree);
            // join it to query
            $tableTwoSelect->join($tableThreeName, $tableOneName, $tableOneName, $tableThreeName . '.' . $relations[$modelThree] . '=' . $tableOneName . '.' . $relations[$modelOne]);
            // set source keys
            $tableTwoSelect->where($tableOneName . '.' . $relations[$modelOne] . ' IN (?)', $keys);
        } else {
            // set source keys
            $tableTwoSelect->where($relations[$modelTwo] . ' IN (?)', $keys);
        }
        return $tableTwoSelect->execute();
    }

Usage Example

Example #1
0
 /**
  * findRelation
  *
  * @param  Row $row
  * @param  string $relation
  * @return array
  * @throws Exception\RelationNotFoundException
  */
 public static function findRelation($row, $relation)
 {
     $model = $row->getTable()->getModel();
     /** @var \Bluz\Db\Table $relationTable */
     $relationTable = Relations::getModelClass($relation);
     $relationTable::getInstance();
     if (!($relations = Relations::getRelations($model, $relation))) {
         throw new RelationNotFoundException("Relations between model `{$model}` and `{$relation}` is not defined");
     }
     // check many-to-many relations
     if (sizeof($relations) == 1) {
         $relations = Relations::getRelations($model, current($relations));
     }
     $field = $relations[$model];
     $key = $row->{$field};
     return Relations::findRelations($model, $relation, [$key]);
 }