PHPackages                             voskobovich/yii2-linker-behavior - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Database &amp; ORM](/categories/database)
4. /
5. voskobovich/yii2-linker-behavior

ActiveYii2-behavior[Database &amp; ORM](/categories/database)

voskobovich/yii2-linker-behavior
================================

This behavior makes it easy to maintain many-to-many and one-to-many relations in your ActiveRecord models.

4.1.0(8y ago)80319.0k—9.1%19[1 issues](https://github.com/voskobovich/yii2-linker-behavior/issues)[2 PRs](https://github.com/voskobovich/yii2-linker-behavior/pulls)9MITPHPPHP &gt;=5.4.0

Since Nov 30Pushed 6y ago10 watchersCompare

[ Source](https://github.com/voskobovich/yii2-linker-behavior)[ Packagist](https://packagist.org/packages/voskobovich/yii2-linker-behavior)[ Docs](https://github.com/voskobovich/yii2-linker-behavior)[ RSS](/packages/voskobovich-yii2-linker-behavior/feed)WikiDiscussions master Synced 1mo ago

READMEChangelog (4)Dependencies (5)Versions (17)Used By (9)

Yii2 Linker Behavior
====================

[](#yii2-linker-behavior)

This is a **NEW** version of a [**Yii2 ManyToMany Behavior**](https://github.com/voskobovich/yii2-many-to-many-behavior).
It's the [**Yii2 ManyToMany Behavior**](https://github.com/voskobovich/yii2-many-to-many-behavior) only in **new implementation architecture**.

---

### Что это?

[](#что-это)

Это копия [**Yii2 ManyToMany Behavior**](https://github.com/voskobovich/yii2-many-to-many-behavior) но с другой архитектурой.

В [Yii2 ManyToMany Behavior](https://github.com/voskobovich/yii2-many-to-many-behavior) некоторые жаловались, что у сохранения много-ко-многим одна логика и она не всем подходит.
Я сделал так, что **логику** обновления связей **можно конфигурировать** без перепилки кода.

В этой сборке реализовано три класса логики (апдейтера):

- **ManyToManyUpdater.php** - удаляет все связи и **перезаписывает** их заново. Его преимущество в том, что обновление происходит за 2 запроса в БД. Подходит для небольшого количества обновляемых связей за раз.
- **ManyToManySmartUpdater.php** - находит разницу и вносит корректировки в связи (удаляет старые, добавляет новые). Он производит уже за 4 запроса, но при этом не убивает существующие связи.
- **OneToManyUpdater.php** - логика работы со связью один-ко-многим. Просто берем Primary Key и присваиваем его к дочерним элементам.

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

Сейчас проект в стадии RC и на новый функционал нужно допилить тестов.
Но в целом тесты которые были на [Yii2 ManyToMany Behavior](https://github.com/voskobovich/yii2-many-to-many-behavior) на этой архитектуре **проходят успешно**.
Так что уже **можно юзать**.

### Что на счет совместимости с [Yii2 ManyToMany Behavior](https://github.com/voskobovich/yii2-many-to-many-behavior)?

[](#что-на-счет-совместимости-с-yii2-manytomany-behavior)

Изменились только параметры конфигурирования компонента.
Нужно просто внимательно свериться с докой [README.md](https://github.com/voskobovich/yii2-linker-behavior/blob/master/README.md) и все будет хорошо.

---

This behavior makes it easy to maintain many-to-many and one-to-many relations in your ActiveRecord models.

[![License](https://camo.githubusercontent.com/734155423b54dd6f8859dbbfba3664fe0433eff9bcb9fbd0857eb6adcfe273ba/68747470733a2f2f706f7365722e707567782e6f72672f766f736b6f626f766963682f796969322d6c696e6b65722d6265686176696f722f6c6963656e73652e737667)](https://packagist.org/packages/voskobovich/yii2-linker-behavior)[![Latest Stable Version](https://camo.githubusercontent.com/7d9c70e211489711676da3d9dd10ea82cb4870c66e423c30c5517dc0b0b777b6/68747470733a2f2f706f7365722e707567782e6f72672f766f736b6f626f766963682f796969322d6c696e6b65722d6265686176696f722f762f737461626c652e737667)](https://packagist.org/packages/voskobovich/yii2-linker-behavior)[![Latest Unstable Version](https://camo.githubusercontent.com/9de4e1e004aac42ef35effd845e58a8e9731a8331432a521903d85bb73b2225f/68747470733a2f2f706f7365722e707567782e6f72672f766f736b6f626f766963682f796969322d6c696e6b65722d6265686176696f722f762f756e737461626c652e737667)](https://packagist.org/packages/voskobovich/yii2-linker-behavior)[![Total Downloads](https://camo.githubusercontent.com/ce2246a02bd359eef3a1fd0f42ba5fd2df2a333e44945cafa6fc65414ebcaa85/68747470733a2f2f706f7365722e707567782e6f72672f766f736b6f626f766963682f796969322d6c696e6b65722d6265686176696f722f646f776e6c6f6164732e737667)](https://packagist.org/packages/voskobovich/yii2-linker-behavior)[![Build Status](https://camo.githubusercontent.com/e780b2ea644ec161cb1ad9b0a9af7fe818d94abc58f88cc66b9441976a3e36bd/68747470733a2f2f7472617669732d63692e6f72672f766f736b6f626f766963682f796969322d6c696e6b65722d6265686176696f722e7376673f6272616e63683d6d6173746572)](https://travis-ci.org/voskobovich/yii2-linker-behavior)

Support
-------

[](#support)

[GutHub issues](https://github.com/voskobovich/yii2-linker-behavior/issues).

Usage
-----

[](#usage)

1. In your model, add the behavior and configure it
2. In your model, add validation rules for the attributes created by the behavior
3. In your view, create form fields for the attributes

Adding and configuring the behavior
-----------------------------------

[](#adding-and-configuring-the-behavior)

As an example, let's assume you are dealing with entities like `Book`, `Author` and `Review`. The `Book` model has the following relationships:

```
public function getAuthors()
{
    return $this->hasMany(
        Author::className(),
        ['id' => 'author_id']
    )->viaTable(
        '{{%book_has_author}}',
        ['book_id' => 'id']
    );
}

public function getReviews()
{
    return $this->hasMany(Review::className(), ['id' => 'review_id']);
}
```

In the same model, the behaviour can be configured like so:

```
public function behaviors()
{
    return [
        [
            'class' => \voskobovich\linker\LinkerBehavior::className(),
            'relations' => [
                'author_ids' => 'authors',
		'review_ids' => 'reviews',
            ],
        ],
    ];
}
```

Relation names don't need to end in `_ids`, and you can use any name for a relation. It is recommended to use meaningful names, though.

Adding validation rules
-----------------------

[](#adding-validation-rules)

The attributes are created automatically. However, you must supply a validation rule for them (usually a `safe` validator):

```
public function rules()
{
    return [
        [['author_ids', 'review_ids'], 'each', 'rule' => ['integer']]
    ];
}
```

Creating form fields
--------------------

[](#creating-form-fields)

By default, the behavior will accept data from a multiselect field:

```
