Mercurial > hg > cmmr2012-drupal-site
comparison core/modules/workspaces/src/EntityQuery/QueryTrait.php @ 4:a9cd425dd02b
Update, including to Drupal core 8.6.10
author | Chris Cannam |
---|---|
date | Thu, 28 Feb 2019 13:11:55 +0000 |
parents | |
children | 12f9dff5fda9 |
comparison
equal
deleted
inserted
replaced
3:307d7a7fd348 | 4:a9cd425dd02b |
---|---|
1 <?php | |
2 | |
3 namespace Drupal\workspaces\EntityQuery; | |
4 | |
5 use Drupal\Core\Database\Connection; | |
6 use Drupal\Core\Entity\EntityTypeInterface; | |
7 use Drupal\workspaces\WorkspaceManagerInterface; | |
8 | |
9 /** | |
10 * Provides workspaces-specific helpers for altering entity queries. | |
11 */ | |
12 trait QueryTrait { | |
13 | |
14 /** | |
15 * The workspace manager. | |
16 * | |
17 * @var \Drupal\workspaces\WorkspaceManagerInterface | |
18 */ | |
19 protected $workspaceManager; | |
20 | |
21 /** | |
22 * Constructs a Query object. | |
23 * | |
24 * @param \Drupal\Core\Entity\EntityTypeInterface $entity_type | |
25 * The entity type definition. | |
26 * @param string $conjunction | |
27 * - AND: all of the conditions on the query need to match. | |
28 * - OR: at least one of the conditions on the query need to match. | |
29 * @param \Drupal\Core\Database\Connection $connection | |
30 * The database connection to run the query against. | |
31 * @param array $namespaces | |
32 * List of potential namespaces of the classes belonging to this query. | |
33 * @param \Drupal\workspaces\WorkspaceManagerInterface $workspace_manager | |
34 * The workspace manager. | |
35 */ | |
36 public function __construct(EntityTypeInterface $entity_type, $conjunction, Connection $connection, array $namespaces, WorkspaceManagerInterface $workspace_manager) { | |
37 parent::__construct($entity_type, $conjunction, $connection, $namespaces); | |
38 | |
39 $this->workspaceManager = $workspace_manager; | |
40 } | |
41 | |
42 /** | |
43 * {@inheritdoc} | |
44 */ | |
45 public function prepare() { | |
46 parent::prepare(); | |
47 | |
48 // Do not alter entity revision queries. | |
49 // @todo How about queries for the latest revision? Should we alter them to | |
50 // look for the latest workspace-specific revision? | |
51 if ($this->allRevisions) { | |
52 return $this; | |
53 } | |
54 | |
55 // Only alter the query if the active workspace is not the default one and | |
56 // the entity type is supported. | |
57 $active_workspace = $this->workspaceManager->getActiveWorkspace(); | |
58 if (!$active_workspace->isDefaultWorkspace() && $this->workspaceManager->isEntityTypeSupported($this->entityType)) { | |
59 $this->sqlQuery->addMetaData('active_workspace_id', $active_workspace->id()); | |
60 $this->sqlQuery->addMetaData('simple_query', FALSE); | |
61 | |
62 // LEFT JOIN 'workspace_association' to the base table of the query so we | |
63 // can properly include live content along with a possible workspace | |
64 // revision. | |
65 $id_field = $this->entityType->getKey('id'); | |
66 $this->sqlQuery->leftJoin('workspace_association', 'workspace_association', "%alias.target_entity_type_id = '{$this->entityTypeId}' AND %alias.target_entity_id = base_table.$id_field AND %alias.workspace = '{$active_workspace->id()}'"); | |
67 } | |
68 | |
69 return $this; | |
70 } | |
71 | |
72 } |