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');
}
}
我认为这应该可行。
在Type
class中添加:
$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']);
我有某些类型的元素。 我有某些类型的垃圾箱。 一个元素只属于同一类型的 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');
}
}
我认为这应该可行。
在Type
class中添加:
$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']);