/**
* Creates new common instance (it means persisted)
*
* @param \Dibi\Row|\Dibi\Row[] $data
* @param string $table
* @param Connection $connection
* @param IMapper $mapper
* @return self
* @throws InvalidArgumentException
*/
public static function createInstance($data, $table, Connection $connection, IMapper $mapper)
{
$dataArray = [];
$primaryKey = $mapper->getPrimaryKey($table);
if ($data instanceof DibiRow) {
$dataArray = [isset($data->{$primaryKey}) ? $data->{$primaryKey} : self::DETACHED_ROW_ID => $data->toArray()];
} else {
$e = new InvalidArgumentException('Invalid type of data given, only \\Dibi\\Row, \\Dibi\\Row[], ArrayAccess[] or array of arrays is supported at this moment.');
if (!is_array($data)) {
throw $e;
}
if (!empty($data)) {
$record = reset($data);
if (!$record instanceof DibiRow and !is_array($record) and !$record instanceof ArrayAccess) {
throw $e;
}
}
foreach ($data as $record) {
$record = (array) $record;
if (isset($record[$primaryKey])) {
$dataArray[$record[$primaryKey]] = $record;
} else {
$dataArray[] = $record;
}
}
}
return new self($dataArray, $table, $connection, $mapper);
}