Merge pull request #1 from civicrm/master
[civicrm-core.git] / CRM / Core / Reference / Dynamic.php
CommitLineData
11626cf1
TO
1<?php
2
3/**
4 * Description of a one-way link between two entities
5 *
6 * This is a generic, soft-foreign key based on a pair of columns (entity_id, entity_table).
7 */
8class CRM_Core_Reference_Dynamic extends CRM_Core_Reference_Basic {
9
a0ee3941
EM
10 /**
11 * @param string $tableName
12 *
13 * @return bool
14 */
11626cf1
TO
15 public function matchesTargetTable($tableName) {
16 return TRUE;
17 }
18
19 /**
d09edf64 20 * Create a query to find references to a particular record.
11626cf1 21 *
6a0b768e
TO
22 * @param CRM_Core_DAO $targetDao
23 * The instance for which we want references.
16b10e64
CW
24 * @return CRM_Core_DAO
25 * a query-handle (like the result of CRM_Core_DAO::executeQuery)
11626cf1
TO
26 */
27 public function findReferences($targetDao) {
28 $refColumn = $this->getReferenceKey();
29 $targetColumn = $this->getTargetKey();
30
be2fb01f
CW
31 $params = [
32 1 => [$targetDao->$targetColumn, 'String'],
11626cf1
TO
33 // If anyone complains about $targetDao::getTableName(), then could use
34 // "{get_class($targetDao)}::getTableName();"
be2fb01f
CW
35 2 => [$targetDao::getTableName(), 'String'],
36 ];
11626cf1
TO
37
38 $sql = <<<EOS
39SELECT id
40FROM {$this->getReferenceTable()}
41WHERE {$refColumn} = %1
42AND {$this->getTypeColumn()} = %2
43EOS;
44
45 $daoName = CRM_Core_DAO_AllCoreTables::getClassForTable($this->getReferenceTable());
46 $result = CRM_Core_DAO::executeQuery($sql, $params, TRUE, $daoName);
47 return $result;
48 }
1256c139 49
a0ee3941
EM
50 /**
51 * @param CRM_Core_DAO $targetDao
52 *
53 * @return array
54 */
1256c139
TO
55 public function getReferenceCount($targetDao) {
56 $targetColumn = $this->getTargetKey();
be2fb01f
CW
57 $params = [
58 1 => [$targetDao->$targetColumn, 'String'],
1256c139
TO
59 // If anyone complains about $targetDao::getTableName(), then could use
60 // "{get_class($targetDao)}::getTableName();"
be2fb01f
CW
61 2 => [$targetDao::getTableName(), 'String'],
62 ];
1256c139
TO
63
64 $sql = <<<EOS
65SELECT count(id)
66FROM {$this->getReferenceTable()}
67WHERE {$this->getReferenceKey()} = %1
68AND {$this->getTypeColumn()} = %2
69EOS;
70
be2fb01f
CW
71 return [
72 'name' => implode(':', ['sql', $this->getReferenceTable(), $this->getReferenceKey()]),
1256c139
TO
73 'type' => get_class($this),
74 'table' => $this->getReferenceTable(),
75 'key' => $this->getReferenceKey(),
21dfd5f5 76 'count' => CRM_Core_DAO::singleValueQuery($sql, $params),
be2fb01f 77 ];
1256c139
TO
78 }
79
11626cf1 80}