ATK4 CRUD:用于数据插入的查找参考 table

ATK4 CRUD: Lookup reference table for data insertion

我有某些类型的元素。 我有某些类型的垃圾箱。 一个元素只属于同一类型的 bin。

DB 中的一个 table 包含元素。 另一个 table 包含垃圾箱。 他们每个人都有一个"type_id".

就元素而言,有几个模型,除了抽象基础模型外,每个模型都设置 ->addCondition('type', '=', 'x') 。

现在,当实例化类型为 X 的元素的 CRUD 时,添加或编辑项目时,如何防止类型为 Y 的容器显示在下拉列表中?

本质上,我想对 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');
  }
}

我认为这应该可行。

Typeclass中添加:

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

AbstractElement class中使用回调定义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']);