id | parent_id | title
1 | 0 | Категория 1
2 | 1 | Категория 1.1
3 | 2 | Категория 1.1.1
4 | 3 | Категория 1.1.1.1
------------------------------------------
5 | 0 | Категория 2
6 | 5 | Категория 2.2
7 | 6 | Категория 2.2.2
public function actionDelete($id)
{
//$this->findModel($id)->delete();
$parent = Category::find()->where(['parent_id' => $id])->one();
if ($parent) {
$child1 = Category::find()->where(['parent_id' => $parent->id])->one();
$child2 = Category::find()->where(['parent_id' => $child1->id])->one();
VarDumper::dump($child1->id,11,1);
VarDumper::dump($child1->parent_id,11,1);
VarDumper::dump($child2->id,11,1);
VarDumper::dump($id,11,1);die();
}
return $this->redirect(['index']);
}
$this->addForeignKey('fk-parent_id', '{{%categories}}', 'pareng_id', '{{%categories}}', 'id', 'CASCADE');
public function up()
{
$this->createTable('{{%category}}', [
'id' => $this->primaryKey()->notNull(),
'parent_id' => $this->integer()->null(),
'status' => $this->integer()->null(),
'title' => $this->string(255)->null(),
'alias' => $this->string(100)->null(),
'sort' => $this->integer()->null(),
'meta_title' => $this->string(200)->null(),
'meta_keywords' => $this->string(200)->null(),
'meta_description' => $this->string(200)->null(),
]);
$this->addForeignKey('fk-parent_id', '{{%category}}', 'parent_id', '{{%category}}', 'id', 'CASCADE');
}
так же перед установкой ключа надо отключить, а затем включить проверку внешнего ключа.
$this->db->createCommand('SET foreign_key_checks=0')->execute();
$this->addForeignKey('fk-parent_id', '{{%category}}', 'parent_id', '{{%category}}', 'id', 'CASCADE');
$this->db->createCommand('SET foreign_key_checks=1')->execute();
$this->createIndex('idx-parent_id', '{{%category}}', 'parent_id');
$this->db->createCommand('SET foreign_key_checks=0')->execute();
$this->addForeignKey('fk-parent_id', '{{%category}}', 'parent_id', '{{%category}}', 'id', 'CASCADE');
$this->db->createCommand('SET foreign_key_checks=1')->execute();
class m190102_165446_category extends Migration
{
// /**
// * {@inheritdoc}
// */
// public function safeUp()
// {
//
// }
//
// /**
// * {@inheritdoc}
// */
// public function safeDown()
// {
// echo "m190102_165446_category cannot be reverted.\n";
//
// return false;
// }
// Use up()/down() to run migration code without a transaction.
public function up()
{
$this->createTable('{{%category}}', [
'id' => $this->primaryKey()->notNull(),
'parent_id' => $this->integer()->null(),
'status' => $this->integer()->null(),
'title' => $this->string(255)->null(),
'alias' => $this->string(100)->null(),
'sort' => $this->integer()->null(),
'meta_title' => $this->string(200)->null(),
'meta_keywords' => $this->string(200)->null(),
'meta_description' => $this->string(200)->null(),
]);
$this->db->createCommand('SET foreign_key_checks=0')->execute();
$this->addForeignKey('fk-parent_id', '{{%category}}', 'parent_id', '{{%category}}', 'id', 'CASCADE');
$this->db->createCommand('SET foreign_key_checks=1')->execute();
}
public function down()
{
echo "m190102_165446_category cannot be reverted.\n";
return false;
}
}
<option value="0">Нет родителя</option>
по первому id собираете массив parent_id первого уровня, потом, идя по первому уровню собираете в массив parent_id второго уровня и так далее., можете показать если не трудно на примере. Потому что может быть большая вложенность!
/**
* Строим дерево категории
* @param $data
* @param int $rootID
* @return array
*/
protected function buildTree($data, $rootID = 0)
{
$tree = [];
foreach ($data as $id => $node) {
if ($node['parent_id'] == $rootID) {
unset($data[$id]);
$node['childs'] = $this->buildTree($data, $node['id']);
$tree[] = $node;
}
}
return $tree;
}
/**
* Получаю все категории
* @return array
*/
public function getAllCategories()
{
$data = self::find()->asArray()->all();
return $this->buildTree($data);
}
но как я могу ее использовать в удаление?