如何在 BuildRules() 函数中查询另一个 table - CakePHP 4.x
How to query another table inside a BuildRules() Function - CakePHP 4.x
我正在尝试在 SRC/Model/Table/InspectorsTable.php 文件中的 buildRules()
函数中查询另一个 table。
背景资料:
目前,我的系统使用用户 table 来存储登录信息。 HERE 是型号。
此用户 table 有 3 个不同的配置文件 table 与之关联。检查员、承包商和员工。
截至目前,检查员、承包商和员工记录可以使用相同的用户外键登录。
我正在努力使单个用户记录只能使用检查员或承包商或员工的单个记录登录。
例如1 名员工的 1 条用户记录 Record/Inspector Record/Contractor 记录。
我正在考虑这样做,我可以使用 buildRules() 函数检查其他 table 以查看用户 table 的主键是否已被另一个 table 在检查员、承包商或雇员的创建上。如果是,则不会创建记录。
我的尝试:
为了尝试实现上述逻辑,我尝试查询我的其他 table 之一(如下所示)。但是,这不起作用。
这里是 SRC/Model/Table/InspectorTables.php:
class InspectorsTable extends Table
{
public function initialize(array $config): void
{
parent::initialize($config);
$this->setTable('inspectors');
$this->setDisplayField('id');
$this->setPrimaryKey('id');
$this->belongsTo('Users', [
'foreignKey' => 'user_id',
'joinType' => 'INNER',
]);
}
public function buildRules(RulesChecker $rules): RulesChecker
{
$rules->add($rules->existsIn(['user_id'], 'Users'), ['errorField' => 'user_id']);
// this line does not work
print_r($this->Contractor->get(10000000));
return $rules;
}
}
但是,当我尝试执行此操作时出现此错误:
Undefined property Contractor. You have not defined the Contractor
association on App\Model\Table\InspectorsTable
我认为这是由于 InspectorsTable.php
的 initialize()
函数中的关联设置所致
任何 help/alternative 解决方案都很棒!谢谢!
Inspectors
和 Contractors
之间没有关联,因此没有您可以在 InspectorsTable
class 上访问的魔法关联 属性。
要访问“不相关的”table,请使用 table 定位器,例如通过 LocatorAwareTrait
:
class InspectorsTable extends Table
{
use Cake\ORM\Locator\LocatorAwareTrait;
// ...
public function buildRules(RulesChecker $rules): RulesChecker
{
// ...
$contractorsTable = $this->getTableLocator()->get('Contractors');
return $rules;
}
}
不确定您的架构是否是您问题域的最佳解决方案,所以我真的不会对此发表评论,只是请注意,所有重复字段看起来都没有优化。
我正在尝试在 SRC/Model/Table/InspectorsTable.php 文件中的 buildRules()
函数中查询另一个 table。
背景资料:
目前,我的系统使用用户 table 来存储登录信息。 HERE 是型号。
此用户 table 有 3 个不同的配置文件 table 与之关联。检查员、承包商和员工。
截至目前,检查员、承包商和员工记录可以使用相同的用户外键登录。
我正在努力使单个用户记录只能使用检查员或承包商或员工的单个记录登录。
例如1 名员工的 1 条用户记录 Record/Inspector Record/Contractor 记录。
我正在考虑这样做,我可以使用 buildRules() 函数检查其他 table 以查看用户 table 的主键是否已被另一个 table 在检查员、承包商或雇员的创建上。如果是,则不会创建记录。
我的尝试:
为了尝试实现上述逻辑,我尝试查询我的其他 table 之一(如下所示)。但是,这不起作用。
这里是 SRC/Model/Table/InspectorTables.php:
class InspectorsTable extends Table
{
public function initialize(array $config): void
{
parent::initialize($config);
$this->setTable('inspectors');
$this->setDisplayField('id');
$this->setPrimaryKey('id');
$this->belongsTo('Users', [
'foreignKey' => 'user_id',
'joinType' => 'INNER',
]);
}
public function buildRules(RulesChecker $rules): RulesChecker
{
$rules->add($rules->existsIn(['user_id'], 'Users'), ['errorField' => 'user_id']);
// this line does not work
print_r($this->Contractor->get(10000000));
return $rules;
}
}
但是,当我尝试执行此操作时出现此错误:
Undefined property Contractor. You have not defined the Contractor association on App\Model\Table\InspectorsTable
我认为这是由于 InspectorsTable.php
的initialize()
函数中的关联设置所致
任何 help/alternative 解决方案都很棒!谢谢!
Inspectors
和 Contractors
之间没有关联,因此没有您可以在 InspectorsTable
class 上访问的魔法关联 属性。
要访问“不相关的”table,请使用 table 定位器,例如通过 LocatorAwareTrait
:
class InspectorsTable extends Table
{
use Cake\ORM\Locator\LocatorAwareTrait;
// ...
public function buildRules(RulesChecker $rules): RulesChecker
{
// ...
$contractorsTable = $this->getTableLocator()->get('Contractors');
return $rules;
}
}
不确定您的架构是否是您问题域的最佳解决方案,所以我真的不会对此发表评论,只是请注意,所有重复字段看起来都没有优化。