ATK4 CRUD: справочная таблица поиска для вставки данных - PullRequest
1 голос
/ 09 апреля 2020

У меня есть элементы определенных типов. У меня есть контейнеры определенных типов. Элемент принадлежит только к бинам того же типа.

Одна таблица в БД содержит элементы. Другая таблица содержит мусорные ведра. Каждый из них имеет "type_id".

Что касается элементов, есть несколько моделей, каждая из которых устанавливает -> addCondition ('type', '=', 'x') в дополнение к абстрактная базовая модель.

Теперь при создании экземпляра CRUD элемента типа X, при добавлении или редактировании элементов, как предотвратить отображение корзин типа Y в раскрывающихся списках?

In Суть Я хотел бы наложить дополнительное условие на hasOne (), которое ограничивает показанные внешние значения.

class AbstractElement extends \atk4\data\Model {
  public $table = 'element';
  public $id_field = 'element_id';
  public $title_field = 'element_data';

  function init() {
    parent::init();

    $this->hasOne('Bin', [Bin::class, 'our_field'=>'element_bin_id', 'caption'=>'Bin', 'required'=>true])->addTitle(['caption'=>'Bin']);
    $this->addField('element_data', ['required'=>true]);
    $this->hasOne('Type', [Type::class, 'our_field'=>'type_id']);
  }
}
class Element extends AbstractElement {
  function init() {
    parent::init();
    $this->addCondition('type_id', '=', '1');
  }
}

class Bin extends \atk4\data\Model {
  public $table = 'bin';
  public $id_field = 'bin_id';
  public $title_field = 'bin_name';

  function init() {
    parent::init();

    $this->addField('bin_name', ['caption'=>'Name']);
    $this->hasOne('Type', [Type::class, 'our_field'=>'bin_type_id']);
  }
}

class Type extends \atk4\data\Model {
  public $table = 'type';
  public $id_field = 'type_id';
  public $title_field = 'type_name';

  function init() {
    parent::init();

    $this->addField('type_name');
  }
}

1 Ответ

1 голос
/ 09 апреля 2020

Я думаю, что это должно работать.

В Type добавление класса:

$this->hasMany('Bins', [Bin::class, 'their_field'=>'bin_type_id']);

В AbstractElement использование обратного вызова класса для определения отношения Bin hasOne:

$this->hasOne('Bin', [
    function($m){
        return $m->ref('Type')->ref('Bins');
    },
    'our_field' => 'element_bin_id',
    'caption' => 'Bin',
    'required' => true,
])->addTitle(['caption'=>'Bin']);
...