LeanMapper\Entity::getHasManyRowDifferences PHP Метод

getHasManyRowDifferences() публичный Метод

Gets current M:N differences
public getHasManyRowDifferences ( ) : array
Результат array
    public function getHasManyRowDifferences()
    {
        $differences = [];
        foreach ($this->getCurrentReflection()->getEntityProperties() as $property) {
            if ($property->hasRelationship() and $property->getRelationship() instanceof Relationship\HasMany) {
                $relationship = $property->getRelationship();
                $difference = $this->row->createReferencingDataDifference($relationship->getRelationshipTable(), $relationship->getColumnReferencingSourceTable(), null, $relationship->getStrategy());
                if ($difference->mayHaveAny()) {
                    $differences[$relationship->getColumnReferencingSourceTable() . ':' . $relationship->getRelationshipTable() . ':' . $relationship->getColumnReferencingTargetTable()] = $difference->getByPivot($relationship->getColumnReferencingTargetTable());
                }
            }
        }
        return $differences;
    }

Usage Example

Пример #1
0
 /**
  * Persists changes in M:N relationships
  *
  * @param Entity $entity
  */
 protected function persistHasManyChanges(Entity $entity)
 {
     $primaryKey = $this->mapper->getPrimaryKey($this->getTable());
     $idField = $this->mapper->getEntityField($this->getTable(), $primaryKey);
     foreach ($entity->getHasManyRowDifferences() as $key => $difference) {
         list($columnReferencingSourceTable, $relationshipTable, $columnReferencingTargetTable) = explode(':', $key);
         $multiInsert = [];
         foreach ($difference as $value => $count) {
             if ($count > 0) {
                 for ($i = 0; $i < $count; $i++) {
                     $multiInsert[] = [$columnReferencingSourceTable => $entity->{$idField}, $columnReferencingTargetTable => $value];
                 }
             } else {
                 $this->connection->query('DELETE FROM %n WHERE %n = ? AND %n = ? %lmt', $relationshipTable, $columnReferencingSourceTable, $entity->{$idField}, $columnReferencingTargetTable, $value, -$count);
             }
         }
         if (!empty($multiInsert)) {
             $this->connection->query('INSERT INTO %n %ex', $relationshipTable, $multiInsert);
         }
     }
 }