Skip to content
Advertisement

Enabling null on many FKs to same associated table

I have multiple fields setup as FK to the same table. The FK can also be NULL.

I keep getting this error:

ExistsIn rule for 'late_agreement_exception_outcome_recommendation_id' is invalid. 'ExceptionOutcomes' is not associated with 'AppModelTableExceptionsTable'.

Database structure:

exceptions
id,
request_id,
late_agreement_exception_outcome_recommendation_id (FK, exception_outcomes->id)
late_agreement_exception_outcome_id (FK, exception_outcomes->id),
...

exception_outcomes
id,
name
...

Column definition (ie. late_agreement_exception_outcome_recommendation_id):

enter image description here

Column relationship (ie. late_agreement_exception_outcome_recommendation_id):

enter image description here

ExceptionTable:

FK setup to ExceptionOutcomes

$this->belongsTo('LateAgreementExceptionOutcomeRecommendations', [
    'class' => 'ExceptionOutcomes',
    'foreignKey' => 'late_agreement_exception_outcome_recommendation_id',
    'joinType' => 'INNER',
]);

Edited rules attempting to enable entry of a null value for the field value:

$rules->add(
    function ($entity, $options) {
        $rule = new ExistsIn('late_agreement_exception_outcome_recommendation_id', 'ExceptionOutcomes');
        return $entity->late_agreement_exception_outcome_recommendation_id === NULL || $rule($entity, $options);
    },
    ['errorField' => 'late_agreement_exception_outcome_recommendation_id']
);

Update #1

I changed the association name like so:

$rules->add(
        function ($entity, $options) {
            $rule = new ExistsIn('late_agreement_exception_outcome_recommendation_id', 'LateAgreementExceptionOutcomeRecommendations');
            return $entity->late_agreement_exception_outcome_recommendation_id === NULL || $rule($entity, $options);
        },
        ['errorField' => 'late_agreement_exception_outcome_recommendation_id']
    );

And got the following issue simply saving the data:

SQLSTATE[42S02]: Base table or view not found: 1146 Table 'sdi_ips2.late_agreement_exception_outcome_recommendations' doesn't exist

Previously, I could save the column when providing a value. However, trying to revert to NULL would cause an issue.

Update #2

try
{
    $this->Requests->save($request);
}
catch(CakeDatabaseExceptionDatabaseException $e)
{
    debug("here!");
    exit;
}

Update #3

Here’s what I see in the SQL log:

Generated Models
The following Table objects used CakeORMTable instead of a concrete class:

LateAgreementExceptionOutcomeRecommendations

Advertisement

Answer

Solution:

Note the className attribute in belongsTo.

$this->belongsTo('LateAgreementExceptionOutcomeRecommendations', [
    'className' => 'ExceptionOutcomes',
    'foreignKey' => 'late_agreement_exception_outcome_recommendation_id',
    'joinType' => 'INNER',
]);
User contributions licensed under: CC BY-SA
4 People found this is helpful
Advertisement