如何在 BuildRules() 函数中查询另一个 table - CakePHP 4.x

How to query another table inside a BuildRules() Function - CakePHP 4.x

我正在尝试在 SRC/Model/Table/InspectorsTable.php 文件中的 buildRules() 函数中查询另一个 table。

背景资料:

我正在考虑这样做,我可以使用 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 解决方案都很棒!谢谢!

InspectorsContractors 之间没有关联,因此没有您可以在 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;
    }
}

不确定您的架构是否是您问题域的最佳解决方案,所以我真的不会对此发表评论,只是请注意,所有重复字段看起来都没有优化。