getName(); $attributeDefs = AttributeDefs::create($name) ->withType(AttributeType::VARCHAR) ->withNotStorable(); $attributeDefs = $this->addWhere($attributeDefs, $fieldDefs, $entityType); return EntityDefs::create() ->withAttribute($attributeDefs); } private function addWhere(AttributeDefs $attributeDefs, FieldDefs $fieldDefs, string $entityType): AttributeDefs { $data = $fieldDefs->getParam('converterData'); if (!is_array($data)) { throw new RuntimeException("No `converterData` in field defs."); } /** @var ?string $column */ $column = $data['column'] ?? null; /** @var ?string $link */ $link = $data['link'] ?? null; /** @var ?string $relationName */ $relationName = $data['relationName'] ?? null; /** @var ?string $nearKey */ $nearKey = $data['nearKey'] ?? null; if (!$column || !$link || !$relationName || !$nearKey) { throw new RuntimeException("Bad `converterData`."); } $midTable = ucfirst($relationName); return $attributeDefs->withParamsMerged([ 'where' => [ '=' => [ 'whereClause' => [ 'id=s' => [ 'from' => $midTable, 'select' => [$nearKey], 'whereClause' => [ 'deleted' => false, $column => '{value}', ], ], ], ], '<>' => [ 'whereClause' => [ 'id!=s' => [ 'from' => $midTable, 'select' => [$nearKey], 'whereClause' => [ 'deleted' => false, $column => '{value}', ], ], ], ], 'IN' => [ 'whereClause' => [ 'id=s' => [ 'from' => $midTable, 'select' => [$nearKey], 'whereClause' => [ 'deleted' => false, $column => '{value}', ], ], ], ], 'NOT IN' => [ 'whereClause' => [ 'id!=s' => [ 'from' => $midTable, 'select' => [$nearKey], 'whereClause' => [ 'deleted' => false, $column => '{value}', ], ], ], ], 'LIKE' => [ 'whereClause' => [ 'id=s' => [ 'from' => $midTable, 'select' => [$nearKey], 'whereClause' => [ 'deleted' => false, "$column*" => '{value}', ], ], ], ], 'NOT LIKE' => [ 'whereClause' => [ 'id!=s' => [ 'from' => $midTable, 'select' => [$nearKey], 'whereClause' => [ 'deleted' => false, "$column*" => '{value}', ], ], ], ], 'IS NULL' => [ 'whereClause' => [ 'NOT' => [ 'EXISTS' => [ 'from' => $entityType, 'fromAlias' => 'sq', 'select' => ['id'], 'leftJoins' => [ [ $link, 'm', null, ['onlyMiddle' => true] ] ], 'whereClause' => [ "m.$column!=" => null, 'sq.id:' => lcfirst($entityType) . '.id', ], ], ], ], ], 'IS NOT NULL' => [ 'whereClause' => [ 'EXISTS' => [ 'from' => $entityType, 'fromAlias' => 'sq', 'select' => ['id'], 'leftJoins' => [ [ $link, 'm', null, ['onlyMiddle' => true] ] ], 'whereClause' => [ "m.$column!=" => null, 'sq.id:' => lcfirst($entityType) . '.id', ], ], ], ], ], ]); } }