4 * Description of a one-way link between two entities
6 * This is a generic, soft-foreign key based on a pair of columns (entity_id, entity_table).
8 class CRM_Core_Reference_Dynamic
extends CRM_Core_Reference_Basic
{
11 * @param string $tableName
15 public function matchesTargetTable($tableName) {
20 * Create a query to find references to a particular record
22 * @param CRM_Core_DAO $targetDao the instance for which we want references
23 * @return CRM_Core_DAO a query-handle (like the result of CRM_Core_DAO::executeQuery)
25 public function findReferences($targetDao) {
26 $refColumn = $this->getReferenceKey();
27 $targetColumn = $this->getTargetKey();
30 1 => array($targetDao->$targetColumn, 'String'),
32 // If anyone complains about $targetDao::getTableName(), then could use
33 // "{get_class($targetDao)}::getTableName();"
34 2 => array($targetDao::getTableName(), 'String'),
39 FROM {$this->getReferenceTable()}
40 WHERE {$refColumn} = %1
41 AND {$this->getTypeColumn()} = %2
44 $daoName = CRM_Core_DAO_AllCoreTables
::getClassForTable($this->getReferenceTable());
45 $result = CRM_Core_DAO
::executeQuery($sql, $params, TRUE, $daoName);
50 * @param CRM_Core_DAO $targetDao
54 public function getReferenceCount($targetDao) {
55 $targetColumn = $this->getTargetKey();
57 1 => array($targetDao->$targetColumn, 'String'),
59 // If anyone complains about $targetDao::getTableName(), then could use
60 // "{get_class($targetDao)}::getTableName();"
61 2 => array($targetDao::getTableName(), 'String'),
66 FROM {$this->getReferenceTable()}
67 WHERE {$this->getReferenceKey()} = %1
68 AND {$this->getTypeColumn()} = %2
72 'name' => implode(':', array('sql', $this->getReferenceTable(), $this->getReferenceKey())),
73 'type' => get_class($this),
74 'table' => $this->getReferenceTable(),
75 'key' => $this->getReferenceKey(),
76 'count' => CRM_Core_DAO
::singleValueQuery($sql, $params)