У меня есть класс Project у которого есть hasMany связь с Page
Код: Выделить всё
class Project extends ActiveRecord
{
public function addPage(Page $page)
{
$pages = $this->pages;
$pages[] = $page;
$this->pages = $pages;
}
public function updatePage(Page $newPage)
{
$pages = $this->pages;
foreach ($pages as $i => $page) {
if ($page->id == $newPage->id) {
array_splice($pages, $i, 0, [$newPage]);
$this->pages = $pages;
return;
}
}
throw new \DomainException('Page is not found.');
}
public function findPage($pageId)
{
foreach ($this->pages as $page) {
if ($page->id == $pageId) {
return $page;
}
}
return null;
}
public function getPages()
{
return $this->hasMany(Page::class, ['projectId' => 'id']);
}
public static function tableName()
{
return '{{%projects}}';
}
public function behaviors()
{
return [
[
'class' => SaveRelationsBehavior::class,
'relations' => [
'pages'
],
],
];
}
public function transactions()
{
return [
self::SCENARIO_DEFAULT => self::OP_ALL,
];
}
}
Код: Выделить всё
class Page extends ActiveRecord
{
public function addItem(Item $item)
{
$items = $this->items;
array_splice($items, $item->sortOrder-1, 0, [$item]);
$sortOrder = 1;
array_map(function(Item $element) use (&$sortOrder) {
$element->sortOrder = $sortOrder++;
}, $items);
$this->items = $items;
}
public function getItems()
{
return $this->hasMany(Item::class, ['pageId' => 'id']);
}
public static function tableName()
{
return '{{%project_page}}';
}
public function behaviors()
{
return [
[
'class' => SaveRelationsBehavior::class,
'relations' => [
'items'
],
],
];
}
public function transactions()
{
return [
self::SCENARIO_DEFAULT => self::OP_ALL,
];
}
}
Код: Выделить всё
$project = Project::findOne(1);
$page = $project->findPage(1);
$page->addItem(new Item());
$project->updatePage($page);
$project->save();
Код: Выделить всё
public function addItem(Item $item)
{
$items = $this->items;
array_splice($items, $item->sortOrder-1, 0, [$item]);
$sortOrder = 1;
array_map(function(Item $element) use (&$sortOrder) {
$element->sortOrder = $sortOrder++;
}, $items);
$this->items = $items;
$this->markAttributeDirty('updatedOn');
}