2016-12-23 6 views
0

Есть ли способ проверить, ссылается ли сущность на внешнюю таблицу (проверьте существование отношения внешнего ключа) и получить сущности или идентификаторы из этих внешних таблиц, которые Связанный?Проверьте, ссылается ли объект на внешнюю таблицу и получает ли она сущности

В следующей ситуации: У меня есть куча сущностей для удаления. Но некоторые из них могут быть указаны в других таблицах. Я работаю в целом, поэтому я не знаю, с какой моделью я работаю ни с какими связями, которые у нее есть. Я хочу фильтровать эти объекты, которые не могут быть удалены, и получить сущности или идентификаторы из внешних таблиц, связанных с моделью, которую я работаю, поэтому я могу показать их после завершения процесса.

код будет в основном следующим образом:

public function removeEntities($table_alias, $data){ 
    $data = $this->checkData($data); //do some work... 
    $table_object = TableRegistry::get($table_alias); 

    // here I'd like to get the entities or ids from tables related to $table_object that can't be deleted 
    $data = $this->check_relationship($table_object, $data); 

    $table_object->deleteAll(["common_index IN" => $data["to_delete"]]); //remove the guys that are related to nobody 
    return $data["cant_delete"]; //return the foreign entities/ids which are related to entities from $table_object 
} 

Если я не ясно, пожалуйста, помогите мне в комментариях. Мне было очень трудно развить этот вопрос.


Предположим, я работаю с Companies, и я должен удалить некоторые из них:

enter image description here

У меня есть список компаний, чтобы удалить, но я могу удалить только те, которые не относящихся к Workers и Clients. Кроме того, я хочу получить связанные Workers и Clients.

+1

Вы, вероятно, хотите, чтобы посмотреть в 'information_schema'. – Uueerdo

ответ

1

Вот функция, которую я написал для этого:

/** 
    * Use model associations to determine whether a record can be deleted. 
    * 
    * @param mixed $id The id of the record to delete 
    * @param array $ignore Optional list of models to ignore 
    * @param array $ignoreDeep Optional list of models to ignore IF they themselves have no dependencies 
    * @return mixed Text list of dependencies found, or false if none 
    */ 
    public function dependencies($id, array $ignore = [], array $ignoreDeep = []) { 
      if ($id === null) { 
        return false; 
      } 

      $dependencies = []; 
      $associations = $this->associations(); 

      foreach ($associations->type('BelongsToMany') as $association) { 
        $class = $association->name(); 
        $foreign_key = $association->foreignKey(); 
        $through = $association->junction()->alias(); 
        $dependent = $association->junction()->find()->where(["$through.$foreign_key" => $id]); 

        $association_conditions = $association->conditions(); 
        if (!empty($association_conditions)) { 
          $dependent->andWhere($association_conditions); 
        } 

        if (in_array($class, $ignoreDeep) || array_key_exists($class, $ignoreDeep)) { 
          foreach ($dependent->extract($association->targetForeignKey())->toArray() as $deepId) { 
            if (array_key_exists($class, $ignoreDeep)) { 
              $deep = $association->dependencies($deepId, $ignoreDeep[$class]); 
            } else { 
              $deep = $association->dependencies($deepId); 
            } 
            if ($deep) { 
              $dependencies[] = __('{0} {1} (with {2})', __(Inflector::delimit(Inflector::singularize($class), ' ')), $deepId, $deep); 
            } 
          } 
        } else if (!in_array($class, $ignore)) { 
          if ($dependent->count() > 0) { 
            $dependencies[] = $dependent->count() . ' ' . __(Inflector::delimit($class, ' ')); 
          } 
        } 

        // BelongsToMany associations also create HasMany associations for the join tables. 
        // Ignore them when we get there. 
        $ignore[] = $through; 
      } 

      foreach ($associations->type('HasMany') as $association) { 
        $class = $association->name(); 
        $foreign_key = $association->foreignKey(); 
        $dependent = $association->target()->find()->where(["$class.$foreign_key" => $id]); 

        $association_conditions = $association->conditions(); 
        if (!empty($association_conditions)) { 
          $dependent->ansWhere($association_conditions); 
        } 

        if (in_array($class, $ignoreDeep) || array_key_exists($class, $ignoreDeep)) { 
          foreach ($dependent->extract($association->primaryKey())->toArray() as $deepId) { 
            if (array_key_exists($class, $ignoreDeep)) { 
              $deep = $association->dependencies($deepId, $ignoreDeep[$class]); 
            } else { 
              $deep = $association->dependencies($deepId); 
            } 
            if ($deep) { 
              $dependencies[] = __('{0} {1} (with {2})', __(Inflector::delimit(Inflector::singularize($class), ' ')), $deepId, $deep); 
            } 
          } 
        } else if (!in_array($class, $ignore)) { 
          if ($dependent->count() > 0) { 
            $dependencies[] = $dependent->count() . ' ' . __(Inflector::delimit($class, ' ')); 
          } 
        } 
      } 

      if (!empty($dependencies)) { 
        return implode(', ', $dependencies); 
      } 
      return false; 
    }