protected function modelToBindSource(DataModel $model, $maxLevel = 1, $modelsProcessed = array())
{
$maxLevel--;
$data = $model->toArray();
$relations = $model->getRelations()->getRelationNames();
$relationTypes = $model->getRelations()->getRelationTypes();
$relationTypes = array_map(function ($x) {
return ltrim($x, '\\');
}, $relationTypes);
$relationTypes = array_flip($relationTypes);
if (is_array($relations) && count($relations) && $maxLevel >= 0) {
foreach ($relations as $relationName) {
$rel = $model->getRelations()->getRelation($relationName);
$class = get_class($rel);
if (!isset($relationTypes[$class])) {
continue;
}
if (!in_array($relationTypes[$class], array('hasOne', 'belongsTo'))) {
continue;
}
/** @var DataModel $relData */
$relData = $model->{$relationName};
if (!$relData instanceof DataModel) {
continue;
}
$modelType = get_class($relData);
if (in_array($modelType, $modelsProcessed)) {
continue;
}
$modelsProcessed[] = $modelType;
$relDataArray = $this->modelToBindSource($relData, $maxLevel, $modelsProcessed);
if (!is_array($relDataArray) || empty($relDataArray)) {
continue;
}
foreach ($relDataArray as $k => $v) {
$data[$relationName . '.' . $k] = $v;
}
}
}
return $data;
}