63 if ($referenceEntity instanceof
Entity)
65 $this->refEntity = $referenceEntity;
66 $this->refEntityName = $referenceEntity->getFullName();
74 parent::__construct(
$name);
93 $this->mediatorEntity =
$entity;
94 $this->mediatorEntityName =
$entity->getFullName();
114 $this->mediatorTableName =
$name;
141 $this->localPrimaryNames[$fieldName] = $mediatorFieldName;
155 $this->localReferenceName =
$name;
170 $this->remotePrimaryNames[$fieldName] = $mediatorFieldName;
184 $this->remoteReferenceName =
$name;
196 return $this->getRefEntity();
204 public function getMediatorEntity()
206 if ($this->mediatorEntity ===
null)
208 if (!empty($this->mediatorEntityName) &&
Entity::has($this->mediatorEntityName))
216 if (empty($this->mediatorTableName))
219 'Table Name for mediator entity of relation `%s` between %s and %s was not found',
220 $this->name, $this->
getEntity()->getObjectClass(), $this->getRefEntity()->getObjectClass()
225 if (empty($this->mediatorEntityName))
227 $localEntityName = $this->
getEntity()->getName();
228 $remoteEntityName = $this->getRefEntity()->getName();
229 $fieldToClassName = StringHelper::snake2camel($this->name);
232 $this->mediatorEntityName =
"MediatorFrom{$localEntityName}To{$remoteEntityName}Via{$fieldToClassName}Table";
239 $localReferenceConditions = Query::filter();
241 foreach ($this->
getEntity()->getPrimaryArray() as $primaryName)
243 $mediatorPrimaryName = $this->localPrimaryNames[$primaryName] ?? $this->
getLocalReferenceName().
'_'.$primaryName;
245 $fieldType = get_class($this->
getEntity()->getField($primaryName));
248 $mediatorPrimary =
new $fieldType($mediatorPrimaryName);
249 $mediatorPrimary->configurePrimary(
true);
254 $localReferenceConditions->whereColumn(
'this.'.$mediatorPrimaryName,
'ref.'.$primaryName);
263 $remoteReferenceConditions = Query::filter();
265 foreach ($this->getRefEntity()->getPrimaryArray() as $primaryName)
267 $mediatorPrimaryName = $this->remotePrimaryNames[$primaryName] ?? $this->
getRemoteReferenceName().
'_'.$primaryName;
269 $fieldType = get_class($this->getRefEntity()->getField($primaryName));
272 $mediatorPrimary =
new $fieldType($mediatorPrimaryName);
273 $mediatorPrimary->configurePrimary(
true);
278 $remoteReferenceConditions->whereColumn(
'this.'.$mediatorPrimaryName,
'ref.'.$primaryName);
282 $remoteReference = (
new Reference($this->
getRemoteReferenceName(), $this->getRefEntity(), $remoteReferenceConditions))
290 $this->mediatorEntity = Entity::compileEntity($this->mediatorEntityName,
$fields, $parameters);
302 if (empty($this->localReferenceName))
304 $this->localReferenceName = strtoupper(StringHelper::camel2snake($this->
getEntity()->
getName()));
329 if (empty($this->remoteReferenceName))
331 $this->remoteReferenceName = strtoupper(StringHelper::camel2snake($this->getRefEntity()->
getName()));
static normalizeName($entityName)
static getInstance($entityName)
configureRemoteReference($name)
configureTableName($name)
configureMediatorTableName($name)
__construct($name, $referenceEntity)
configureLocalPrimary($fieldName, $mediatorFieldName)
configureRemotePrimary($fieldName, $mediatorFieldName)
configureLocalReference($name)
configureMediatorEntity($entity)