1 | <?php |
||
2 | namespace andmemasin\myabstract; |
||
3 | |||
4 | use Yii; |
||
5 | |||
6 | /** |
||
7 | * This is a base class for models that bind/assign child models to |
||
8 | * parent models. Typically named as ParentHasChild pattern |
||
9 | * @property bool $isAlreadyAssigned whether there is already a model with this parent-child relation |
||
10 | */ |
||
11 | class MyAssignModel extends MyActiveRecord |
||
12 | { |
||
13 | |||
14 | /* @var $parentIdColumnName string Column name containing parent id FK */ |
||
0 ignored issues
–
show
Documentation
Bug
introduced
by
![]() |
|||
15 | public $parentIdColumnName; |
||
16 | |||
17 | /* @var $childIdColumnName string Column name containing child id FK */ |
||
0 ignored issues
–
show
|
|||
18 | public $childIdColumnName; |
||
19 | |||
20 | public function rules() |
||
21 | { |
||
22 | return array_merge(parent::rules(), [ |
||
23 | [[$this->parentIdColumnName, $this->childIdColumnName], 'required'], |
||
24 | [$this->childIdColumnName, function($attribute) { |
||
25 | if ($this->isAlreadyAssigned) { |
||
26 | $this->addError($attribute, Yii::t('app', "Can only be used once!")); |
||
27 | } |
||
28 | }], |
||
29 | ]); |
||
30 | } |
||
31 | |||
32 | /** |
||
33 | * @param MyActiveRecord $parent |
||
34 | * @param MyActiveRecord $child |
||
35 | * @return void |
||
36 | */ |
||
37 | public function assign($parent, $child) |
||
38 | { |
||
39 | $this->{$this->parentIdColumnName} = $parent->primaryKey; |
||
40 | $this->{$this->childIdColumnName} = $child->primaryKey; |
||
41 | return null; |
||
42 | } |
||
43 | |||
44 | /** |
||
45 | * @return bool |
||
46 | */ |
||
47 | public function getIsAlreadyAssigned() { |
||
48 | if ($this->isNewRecord) { |
||
49 | $model = static::find() |
||
50 | ->andWhere([$this->parentIdColumnName => $this->{$this->parentIdColumnName}]) |
||
51 | ->andWhere([$this->childIdColumnName => $this->{$this->childIdColumnName}]) |
||
52 | ->all(); |
||
53 | return !empty($model); |
||
54 | } |
||
55 | return false; |
||
56 | } |
||
57 | |||
58 | } |