Entity API http://lobsterr.me/ en How to use entity query conditions for complex fields in drupal? http://lobsterr.me/post/how-use-entity-query-conditions-complex-fields-drupal <span class="field field--name-title field--type-string field--label-hidden">How to use entity query conditions for complex fields in drupal?</span> <div class="field field--name-f-intro field--type-string-long field--label-hidden field__item">Entity query conditions can be tricky, but at the same time it does a lot of things in the background for us. Let&#039;s check how to use it.</div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/user/1" typeof="schema:Person" property="schema:name" datatype="">LOBsTerr</span></span> <span class="field field--name-created field--type-created field--label-hidden">03/03/2021</span> <div class="field field--name-f-content field--type-entity-reference-revisions field--label-hidden field__items"> <div class="field__item"> <div class="paragraph paragraph--type--l-text paragraph--view-mode--default"> <div class="clearfix text-formatted field field--name-f-text field--type-text-long field--label-hidden field__item"><h3>Select nodes of the specific content type using entity query</h3> <p>Let's start from the most simple example. Fetch all nodes of type <strong>article</strong><br />  </p> <pre> <code class="language-php">$query = \Drupal::service('entity_type.manager')-&gt;getStorage('node')-&gt;getQuery() -&gt;condition('type', 'article') $results = $query-&gt;execute();</code></pre> <h3> </h3> <h3>Select nodes by a simple field using entity query</h3> <p>Let's imagine our node have a simple field <strong>field_text</strong> and we want to fetch all nodes with some value.</p> <pre> <code class="language-php">$query = \Drupal::service('entity_type.manager')-&gt;getStorage('node')-&gt;getQuery() -&gt;condition('field_text', 'my value') $results = $query-&gt;execute();</code></pre> <h3> </h3> <h3>Select nodes by a complex fields (containing several subvalues) using entity query</h3> <p>Let's imagine we have a <strong>field_link </strong>of type Link. Such fields contain uri and title. </p> <pre> <code class="language-php">$query = \Drupal::service('entity_type.manager')-&gt;getStorage('node')-&gt;getQuery() -&gt;condition('field_link', 'my value') $results = $query-&gt;execute();</code></pre> <p>In this case by default uri will be used and we will get </p> <pre> <code class="language-sql">WHERE node__field_link.field_link_uri = '1'</code></pre> <p>To filter by the title of the link we need to use the next code</p> <pre> <code class="language-php">$results = \Drupal::service('entity_type.manager')-&gt;getStorage('node')-&gt;getQuery() -&gt;condition('field_link.title', 'my value') $results = $query-&gt;execute();</code></pre> <h3> </h3> <h3>Select nodes by a reference fields using entity query</h3> <p>Let's imagine we have <strong>field_tags </strong>which has a reference to taxonomy <strong>tags</strong>.</p> <pre> <code class="language-php">$query = \Drupal::service('entity_type.manager')-&gt;getStorage('node')-&gt;getQuery() -&gt;condition('type', 'article') -&gt;condition('field_tag.entity:taxonomy_term.name', 'My tag') $results = $query-&gt;execute();</code></pre> <p>As a result we will get such SQL query:</p> <pre> <code class="language-sql">SELECT base_table.vid AS vid, base_table.nid AS nid FROM node base_table INNER JOIN node__field_tag node__field_tag ON node__field_tag.entity_id = base_table.nid LEFT OUTER JOIN taxonomy_term_data taxonomy_term_data ON taxonomy_term_data.tid = node__field_tag.field_tag_target_id INNER JOIN taxonomy_term_field_data taxonomy_term_field_data ON taxonomy_term_field_data.tid = taxonomy_term_data.tid WHERE taxonomy_term_field_data.name LIKE 'My tag' ESCAPE '\\'SELECT base_table.vid AS vid, base_table.nid AS nid FROM node base_table INNER JOIN node__field_tag node__field_tag ON node__field_tag.entity_id = base_table.nid LEFT OUTER JOIN taxonomy_term_data taxonomy_term_data ON taxonomy_term_data.tid = node__field_tag.field_tag_target_id INNER JOIN taxonomy_term_field_data taxonomy_term_field_data ON taxonomy_term_field_data.tid = taxonomy_term_data.tid WHERE taxonomy_term_field_data.name LIKE 'My tag' ESCAPE '\\'SELECT base_table.vid AS vid, base_table.nid AS nid FROM node base_table INNER JOIN node__field_tag node__field_tag ON node__field_tag.entity_id = base_table.nid LEFT OUTER JOIN taxonomy_term_data taxonomy_term_data ON taxonomy_term_data.tid = node__field_tag.field_tag_target_id INNER JOIN taxonomy_term_field_data taxonomy_term_field_data ON taxonomy_term_field_data.tid = taxonomy_term_data.tid WHERE taxonomy_term_field_data.name LIKE 'My tag' ESCAPE '\\'</code></pre> <p>We can the same way extract the field of referenced entities and their referenced entities.</p> <p> </p> </div> </div> </div> </div> <div class="field field--name-f-tags field--type-entity-reference field--label-hidden field__items"> <div class="field__item btn btn-secondary"><a href="/tags/drupal-9" hreflang="en">Drupal 9</a></div> <div class="field__item btn btn-secondary"><a href="/tags/entity-api" hreflang="en">Entity API</a></div> </div> <section class="field field--name-f-comments field--type-comment field--label-above comment-wrapper"> </section> Wed, 03 Mar 2021 13:53:15 +0000 LOBsTerr 41 at http://lobsterr.me How to list content entities in Drupal 9? http://lobsterr.me/post/how-list-content-entities-drupal-9 <span class="field field--name-title field--type-string field--label-hidden">How to list content entities in Drupal 9?</span> <div class="field field--name-f-intro field--type-string-long field--label-hidden field__item">If you need to get a list of content entitles in your Drupal 9 website for example for drop down on the configuration page you can use the next code snippet</div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/user/1" typeof="schema:Person" property="schema:name" datatype="">LOBsTerr</span></span> <span class="field field--name-created field--type-created field--label-hidden">01/13/2021</span> <div class="field field--name-f-content field--type-entity-reference-revisions field--label-hidden field__items"> <div class="field__item"> <div class="paragraph paragraph--type--l-text paragraph--view-mode--default"> <div class="clearfix text-formatted field field--name-f-text field--type-text-long field--label-hidden field__item"><pre> <code class="language-php">use Drupal\Core\Entity\ContentEntityType; $content_entities = []; // Get all entities definitions. $entity_type_definations = \Drupal::entityTypeManager()-&gt;getDefinitions(); foreach ($entity_type_definations as $definition) { // Check that definition is instance of ContentEntityType if ($definition instanceof ContentEntityType) { $content_entities [] = $definition; } }</code></pre> <p> </p> </div> </div> </div> </div> <div class="field field--name-f-tags field--type-entity-reference field--label-hidden field__items"> <div class="field__item btn btn-secondary"><a href="/tags/drupal-9" hreflang="en">Drupal 9</a></div> <div class="field__item btn btn-secondary"><a href="/tags/entity-api" hreflang="en">Entity API</a></div> <div class="field__item btn btn-secondary"><a href="/tags/entity" hreflang="en">Entity</a></div> <div class="field__item btn btn-secondary"><a href="/tags/entity-type" hreflang="en">Entity type</a></div> </div> <section class="field field--name-f-comments field--type-comment field--label-above comment-wrapper"> </section> Wed, 13 Jan 2021 21:54:31 +0000 LOBsTerr 25 at http://lobsterr.me How to remove (uninstall) entity type in Drupal 8? http://lobsterr.me/post/how-remove-uninstall-entity-type-drupal-8 <span class="field field--name-title field--type-string field--label-hidden">How to remove (uninstall) entity type in Drupal 8?</span> <div class="field field--name-f-intro field--type-string-long field--label-hidden field__item">If we don&#039;t need some entity type anymore we can easily remove it.</div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/user/1" typeof="schema:Person" property="schema:name" datatype="">LOBsTerr</span></span> <span class="field field--name-created field--type-created field--label-hidden">06/04/2020</span> <div class="field field--name-f-content field--type-entity-reference-revisions field--label-hidden field__items"> <div class="field__item"> <div class="paragraph paragraph--type--l-text paragraph--view-mode--default"> <div class="clearfix text-formatted field field--name-f-text field--type-text-long field--label-hidden field__item"><pre> <code class="language-php">// Get update manager. $definition_update_manager = \Drupal::entityDefinitionUpdateManager(); // Get entity type. $entity_type = $definition_update_manager-&gt;getEntityType('your_entity_type_id'); if ($entity_type ) { // Uninstall entity type. $definition_update_manager-&gt;uninstallEntityType($entity_type); }</code></pre> <p> </p> </div> </div> </div> </div> <div class="field field--name-f-tags field--type-entity-reference field--label-hidden field__items"> <div class="field__item btn btn-secondary"><a href="/tags/entity-api" hreflang="en">Entity API</a></div> <div class="field__item btn btn-secondary"><a href="/tags/entity" hreflang="en">Entity</a></div> <div class="field__item btn btn-secondary"><a href="/tags/entity-type" hreflang="en">Entity type</a></div> </div> <div class="field field--name-f-related-items field--type-entity-reference field--label-above list-group list-group-flush"> <div class="field__label">Related items</div> <ul class="field field--name-f-related-items field--type-entity-reference field--label-above list-group list-group-flush field__items"> <li class="field__item list-group-item"><a href="/post/how-update-entity-field-drupal-8" hreflang="en">How to update entity field in Drupal 8?</a></li> </ul> </div> <section class="field field--name-f-comments field--type-comment field--label-above comment-wrapper"> </section> Thu, 04 Jun 2020 08:25:07 +0000 LOBsTerr 24 at http://lobsterr.me How to update entity field in Drupal 8? http://lobsterr.me/post/how-update-entity-field-drupal-8 <span class="field field--name-title field--type-string field--label-hidden">How to update entity field in Drupal 8?</span> <div class="field field--name-f-intro field--type-string-long field--label-hidden field__item">Sometimes we need to update some settings for a field. In our case we will be update drop down field</div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/user/1" typeof="schema:Person" property="schema:name" datatype="">LOBsTerr</span></span> <span class="field field--name-created field--type-created field--label-hidden">06/04/2020</span> <div class="field field--name-f-content field--type-entity-reference-revisions field--label-hidden field__items"> <div class="field__item"> <div class="paragraph paragraph--type--l-text paragraph--view-mode--default"> <div class="clearfix text-formatted field field--name-f-text field--type-text-long field--label-hidden field__item"><pre> <code class="language-php">function your_module_update_8001() { // First we need to get update manager. $definition_update_manager = \Drupal::entityDefinitionUpdateManager(); // Load the storage definition of the field. $field_storage = $definition_update_manager-&gt;getFieldStorageDefinition('field_name', 'node'); // Set a new list of options for the list field. $field_storage-&gt;setSettings([ 'allowed_values' =&gt; [ 'link' =&gt; 'Link', 'posts' =&gt; 'Posts', 'events' =&gt; 'Events', 'page' =&gt; 'Page', ], ]); // Update the field storage definition. $definition_update_manager-&gt;updateFieldStorageDefinition($field_storage); } </code></pre> <p> </p> </div> </div> </div> </div> <div class="field field--name-f-tags field--type-entity-reference field--label-hidden field__items"> <div class="field__item btn btn-secondary"><a href="/tags/entity-api" hreflang="en">Entity API</a></div> <div class="field__item btn btn-secondary"><a href="/tags/entity" hreflang="en">Entity</a></div> <div class="field__item btn btn-secondary"><a href="/tags/field" hreflang="en">Field</a></div> </div> <section class="field field--name-f-comments field--type-comment field--label-above comment-wrapper"> </section> Wed, 03 Jun 2020 22:43:16 +0000 LOBsTerr 23 at http://lobsterr.me How to load entity by a specific field value in Drupal 9? http://lobsterr.me/post/how-load-entity-specific-field-value-drupal-9 <span class="field field--name-title field--type-string field--label-hidden">How to load entity by a specific field value in Drupal 9?</span> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/user/1" typeof="schema:Person" property="schema:name" datatype="">LOBsTerr</span></span> <span class="field field--name-created field--type-created field--label-hidden">11/25/2019</span> <div class="field field--name-f-content field--type-entity-reference-revisions field--label-hidden field__items"> <div class="field__item"> <div class="paragraph paragraph--type--l-text paragraph--view-mode--default"> <div class="clearfix text-formatted field field--name-f-text field--type-text-long field--label-hidden field__item"><p>Quite often it is required to get data by a field value. In our example I will use nodes, but it can be any entity type.</p> <p>In first example we load entities by based fields. For example vid, type, language and etc.</p> <p>I want to get all the nodes of the type <strong>post </strong> for my custom block. For this we will use <strong>EntityTypeManager </strong>class</p> <pre> <code class="language-php">// Load a storage for node entity type $items = \Drupal::entityTypeManager() -&gt;getStorage('node') -&gt;loadByProperties(['type' =&gt; 'post']); // load all nodes with the node type</code></pre> <p>After we can run through the items and apply our custom logic here.</p> <p>In the second example, we will get entities based on custom fields. For example we have field "<strong>field_type</strong>"</p> <pre> <code class="language-php">$query = $this-&gt;entityTypeManager-&gt;getStorage('node')-&gt;getQuery(); $query-&gt;condition('status', 1) -&gt;condition('changed', REQUEST_TIME, '&lt;') -&gt;condition('field_type', 'post'); $nids = $query-&gt;execute();</code></pre> <p>More examples can be found here: <a href="https://www.drupal.org/node/1827278">EntityFieldQuery</a></p> </div> </div> </div> </div> <div class="field field--name-f-tags field--type-entity-reference field--label-hidden field__items"> <div class="field__item btn btn-secondary"><a href="/tags/drupal-9" hreflang="en">Drupal 9</a></div> <div class="field__item btn btn-secondary"><a href="/tags/entity-api" hreflang="en">Entity API</a></div> <div class="field__item btn btn-secondary"><a href="/tags/field" hreflang="en">Field</a></div> </div> <section class="field field--name-f-comments field--type-comment field--label-above comment-wrapper"> </section> Mon, 25 Nov 2019 13:54:44 +0000 LOBsTerr 20 at http://lobsterr.me How list content types (entity bundles list) in Drupal? http://lobsterr.me/post/how-list-content-types-entity-bundles-list-drupal <span class="field field--name-title field--type-string field--label-hidden">How list content types (entity bundles list) in Drupal?</span> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/user/1" typeof="schema:Person" property="schema:name" datatype="">LOBsTerr</span></span> <span class="field field--name-created field--type-created field--label-hidden">09/16/2019</span> <div class="field field--name-f-content field--type-entity-reference-revisions field--label-hidden field__items"> <div class="field__item"> <div class="paragraph paragraph--type--l-text paragraph--view-mode--default"> <div class="clearfix text-formatted field field--name-f-text field--type-text-long field--label-hidden field__item"><p>To get list of content types (entity bundles) in Drupal 8, we need to call entity storage and load all available items</p> <pre> <code class="language-php">$node_types = \Drupal::entityTypeManager() -&gt;getStorage('node_type') -&gt;loadMultiple();</code></pre> </div> </div> </div> </div> <div class="field field--name-f-tags field--type-entity-reference field--label-hidden field__items"> <div class="field__item btn btn-secondary"><a href="/tags/node" hreflang="en">Node</a></div> <div class="field__item btn btn-secondary"><a href="/tags/drupal-9" hreflang="en">Drupal 9</a></div> <div class="field__item btn btn-secondary"><a href="/tags/entity-api" hreflang="en">Entity API</a></div> </div> <section class="field field--name-f-comments field--type-comment field--label-above comment-wrapper"> </section> Mon, 16 Sep 2019 11:10:20 +0000 LOBsTerr 15 at http://lobsterr.me How to render programatically custom entity form mode in Drupal? http://lobsterr.me/post/how-render-programatically-custom-entity-form-mode-drupal <span class="field field--name-title field--type-string field--label-hidden">How to render programatically custom entity form mode in Drupal?</span> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/user/1" typeof="schema:Person" property="schema:name" datatype="">LOBsTerr</span></span> <span class="field field--name-created field--type-created field--label-hidden">09/12/2019</span> <div class="field field--name-f-content field--type-entity-reference-revisions field--label-hidden field__items"> <div class="field__item"> <div class="paragraph paragraph--type--l-text paragraph--view-mode--default"> <div class="clearfix text-formatted field field--name-f-text field--type-text-long field--label-hidden field__item"><p>Sometime we want to render entity form on a custom page or even a block. It is possible to do in Drupal 8, because we can create custom entity form mode.</p> <p>Let's imagine we have a node type "<em>Post</em>" and  this content type has a lot of custom fields. We have technical field "<em>E-mails</em>" and we want to send e-mails, when someone comments this node.</p> <p>For the sake of the example we don't want to "pollute" the main node form with "<em>E-mails</em>" field and we want to create a separate form mode "email_settings" for it.</p> <p>If you try to display it programatically, you will face the exception:</p> <pre> <code class="language-php">public function emailSettings($node) { return $this-&gt;entityFormBuilder()-&gt;getForm($node, 'email_settings'); }</code></pre> <p> </p> <pre> <code class="language-php">The website encountered an unexpected error. Please try again later. Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException: The "node" entity type did not specify a "email_settings" form class. in Drupal\Core\Entity\EntityTypeManager-&gt;getFormObject() (line 223 of core/lib/Drupal/Core/Entity/EntityTypeManager.php). Drupal\Core\Entity\EntityFormBuilder-&gt;getForm(Object, 'email_settings') (Line: 10) Drupal\custom_entity_form_mode\Controller\CustomEntityFormModeController-&gt;emailSettings(Object) call_user_func_array(Array, Array) (Line: 123) Drupal\Core\EventSubscriber\EarlyRenderingControllerWrapperSubscriber-&gt;Drupal\Core\EventSubscriber\{closure}() (Line: 582) Drupal\Core\Render\Renderer-&gt;executeInRenderContext(Object, Object) (Line: 124) Drupal\Core\EventSubscriber\EarlyRenderingControllerWrapperSubscriber-&gt;wrapControllerExecutionInRenderContext(Array, Array) (Line: 97) Drupal\Core\EventSubscriber\EarlyRenderingControllerWrapperSubscriber-&gt;Drupal\Core\EventSubscriber\{closure}() (Line: 151) Symfony\Component\HttpKernel\HttpKernel-&gt;handleRaw(Object, 1) (Line: 68) Symfony\Component\HttpKernel\HttpKernel-&gt;handle(Object, 1, 1) (Line: 57) Drupal\Core\StackMiddleware\Session-&gt;handle(Object, 1, 1) (Line: 47) Drupal\Core\StackMiddleware\KernelPreHandle-&gt;handle(Object, 1, 1) (Line: 106) Drupal\page_cache\StackMiddleware\PageCache-&gt;pass(Object, 1, 1) (Line: 85) Drupal\page_cache\StackMiddleware\PageCache-&gt;handle(Object, 1, 1) (Line: 47) Drupal\Core\StackMiddleware\ReverseProxyMiddleware-&gt;handle(Object, 1, 1) (Line: 52) Drupal\Core\StackMiddleware\NegotiationMiddleware-&gt;handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel-&gt;handle(Object, 1, 1) (Line: 693) Drupal\Core\DrupalKernel-&gt;handle(Object) (Line: 19)</code></pre> <p>but it the same time if we use "default" form mode, it works perfectly</p> <pre> <code class="language-php">public function emailSettings($node) { return $this-&gt;entityFormBuilder()-&gt;getForm($node, 'default'); }</code></pre> <p>Why it happens? Well, it is quite simple the entity, in our case node, just has no idea how to handle our custom form mode. To be more precise entity doesn't know, which class to use to handle form mode.</p> <p>If you check node entity annotation, there is no information about our custom form mode. Unfortunately, It is not done automatically.<br />  </p> <pre> <code class="language-yaml"> * "form" = { * "default" = "Drupal\node\NodeForm", * "delete" = "Drupal\node\Form\NodeDeleteForm", * "edit" = "Drupal\node\NodeForm", * "delete-multiple-confirm" = "Drupal\node\Form\DeleteMultiple" * },</code></pre> <p>We have to alter the entity for this we will use hook_entity_type_alter. Full code could be found here: <a href="https://github.com/LOBsTerr/drupal-modules-examples/tree/master/custom_entity_form_mode">https://github.com/LOBsTerr/drupal-modules-examples/tree/master/custom_entity_form_mode</a></p> <pre> <code class="language-php">/** * Implements hook_entity_type_alter(). */ function custom_entity_form_mode_entity_type_alter(array &amp;$entity_types) { // You can provide more complex logic and checks here, we are sure that node // module is active and it is enabled in our case. $default_handler_class = $entity_types['node']-&gt;getHandlerClasses()['form']['default']; $entity_types['node']-&gt;setFormClass('emails_settings', $default_handler_class); }</code></pre> <p>Now you can create a node of content type, for which you have create form mode and open your custom page. In our example /email-settings/[nid]</p> <p> </p> <p>Now you can display your form in any place you want</p> <p> </p> </div> </div> </div> </div> <div class="field field--name-f-tags field--type-entity-reference field--label-hidden field__items"> <div class="field__item btn btn-secondary"><a href="/tags/entity" hreflang="en">Entity</a></div> <div class="field__item btn btn-secondary"><a href="/tags/form" hreflang="en">Form</a></div> <div class="field__item btn btn-secondary"><a href="/tags/drupal-9" hreflang="en">Drupal 9</a></div> <div class="field__item btn btn-secondary"><a href="/tags/entity-api" hreflang="en">Entity API</a></div> </div> <section class="field field--name-f-comments field--type-comment field--label-above comment-wrapper"> </section> Thu, 12 Sep 2019 08:53:37 +0000 LOBsTerr 13 at http://lobsterr.me How to add a SQL index to existing entity tables http://lobsterr.me/post/how-add-sql-index-existing-entity-tables <span class="field field--name-title field--type-string field--label-hidden">How to add a SQL index to existing entity tables</span> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/user/1" typeof="schema:Person" property="schema:name" datatype="">LOBsTerr</span></span> <span class="field field--name-created field--type-created field--label-hidden">09/03/2019</span> <div class="field field--name-f-content field--type-entity-reference-revisions field--label-hidden field__items"> <div class="field__item"> <div class="paragraph paragraph--type--l-text paragraph--view-mode--default"> <div class="clearfix text-formatted field field--name-f-text field--type-text-long field--label-hidden field__item"><p>Drupal 8 provides a nice Entity API, which handles a lot of complicated mechanisms for us automatically. For example, the handling of tables for Content Entity. In some cases if we are fetching frequently entity tables and we need to improve the performance by providing additional indexes in database tables. There are different ways to do so. The first option you can think of to add directly using SQL query or Schema API. Obviously, it is not a the best way, because a lot of thing can go wrong here.</p> <p>Luckily Drupal 8 provides nice way to do it.</p> <p>First of all we need to define a Storage Schema class. Let's take as an example node module:</p> <pre> <code class="language-php">&lt;?php namespace Drupal\node; use Drupal\Core\Entity\ContentEntityTypeInterface; use Drupal\Core\Entity\Sql\SqlContentEntityStorageSchema; use Drupal\Core\Field\FieldStorageDefinitionInterface; /** * Defines the node schema handler. */ class NodeStorageSchema extends SqlContentEntityStorageSchema { /** * {@inheritdoc} */ protected function getEntitySchema(ContentEntityTypeInterface $entity_type, $reset = FALSE) { $schema = parent::getEntitySchema($entity_type, $reset); if ($data_table = $this-&gt;storage-&gt;getDataTable()) { $schema[$data_table]['indexes'] += [ 'node__frontpage' =&gt; ['promote', 'status', 'sticky', 'created'], 'node__title_type' =&gt; ['title', ['type', 4]], ]; } return $schema; } /** * {@inheritdoc} */ protected function getSharedTableFieldSchema(FieldStorageDefinitionInterface $storage_definition, $table_name, array $column_mapping) { $schema = parent::getSharedTableFieldSchema($storage_definition, $table_name, $column_mapping); $field_name = $storage_definition-&gt;getName(); if ($table_name == 'node_revision') { switch ($field_name) { case 'langcode': $this-&gt;addSharedTableFieldIndex($storage_definition, $schema, TRUE); break; case 'revision_uid': $this-&gt;addSharedTableFieldForeignKey($storage_definition, $schema, 'users', 'uid'); break; } } if ($table_name == 'node_field_data') { switch ($field_name) { case 'promote': case 'status': case 'sticky': case 'title': // Improves the performance of the indexes defined // in getEntitySchema(). $schema['fields'][$field_name]['not null'] = TRUE; break; case 'changed': case 'created': // @todo Revisit index definitions: // https://www.drupal.org/node/2015277. $this-&gt;addSharedTableFieldIndex($storage_definition, $schema, TRUE); break; } } return $schema; } } </code></pre> <p><br /> I will explain a little bit the code above before we continue. We have few options here</p> <p>1) Add composite index, which includes several fields like this:<br />  </p> <pre> <code class="language-php"> if ($data_table = $this-&gt;storage-&gt;getDataTable()) { $schema[$data_table]['indexes'] += [ 'node__frontpage' =&gt; ['promote', 'status', 'sticky', 'created'], 'node__title_type' =&gt; ['title', ['type', 4]], ]; }</code></pre> <p>2) Add an index for specific field:</p> <pre> <code class="language-php">case 'langcode': $this-&gt;addSharedTableFieldIndex($storage_definition, $schema, TRUE); break;</code></pre> <p>3) Add a foreign key</p> <pre> <code class="language-php">case 'revision_uid': $this-&gt;addSharedTableFieldForeignKey($storage_definition, $schema, 'users', 'uid'); break;</code></pre> <p>4) Add additional properties for the fields</p> <pre> <code class="language-php">case 'title': // Improves the performance of the indexes defined // in getEntitySchema(). $schema['fields'][$field_name]['not null'] = TRUE; break;</code></pre> <p> </p> <p>Now, when we have a class for Storage Schema, we need to add it to entity definition. Check Drupal\node\Entity\Node.php</p> <pre> <code class="language-php"> * handlers = { * "storage" = "Drupal\node\NodeStorage", * "storage_schema" = "Drupal\node\NodeStorageSchema", * "view_builder" = "Drupal\node\NodeViewBuilder",</code></pre> <p>No we to update our entity and set Storage Schema class for existing entity. We can do it using hook update</p> <pre> <code class="language-php">&lt;?php use Drupal\your_module\YourStorageSchema; /** * Add storage schema to entity type. */ function your_module_update_8017() { $manager = \Drupal::entityDefinitionUpdateManager(); // Get the current entity type definition, ensure the storage schema // class is set. $entity_type = $manager-&gt;getEntityType('enity_type') -&gt;setHandlerClass('storage_schema', YourStorageSchema::class); // Regenerate entity type indexes. $manager-&gt;updateEntityType($entity_type); }</code></pre> <p>Or if we have already had the Storage Schema class before, we can just update Entity type</p> <pre> <code class="language-php">&lt;?php use Drupal\your_module\YourStorageSchema; /** * Update entity type. */ function your_module_update_8017() { $manager = \Drupal::entityDefinitionUpdateManager(); $entity_type = $manager-&gt;getEntityType('enity_type'); // Regenerate entity type indexes. $manager-&gt;updateEntityType($entity_type); }</code></pre> <p> </p> </div> </div> </div> </div> <div class="field field--name-f-tags field--type-entity-reference field--label-hidden field__items"> <div class="field__item btn btn-secondary"><a href="/tags/drupal-9" hreflang="en">Drupal 9</a></div> <div class="field__item btn btn-secondary"><a href="/tags/entity" hreflang="en">Entity</a></div> <div class="field__item btn btn-secondary"><a href="/tags/entity-api" hreflang="en">Entity API</a></div> <div class="field__item btn btn-secondary"><a href="/tags/index" hreflang="en">Index</a></div> </div> <section class="field field--name-f-comments field--type-comment field--label-above comment-wrapper"> </section> Tue, 03 Sep 2019 08:18:28 +0000 LOBsTerr 9 at http://lobsterr.me How to delete entity in Drupal? http://lobsterr.me/post/how-delete-entity-drupal <span class="field field--name-title field--type-string field--label-hidden">How to delete entity in Drupal?</span> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/user/1" typeof="schema:Person" property="schema:name" datatype="">LOBsTerr</span></span> <span class="field field--name-created field--type-created field--label-hidden">09/02/2019</span> <div class="field field--name-f-content field--type-entity-reference-revisions field--label-hidden field__items"> <div class="field__item"> <div class="paragraph paragraph--type--l-text paragraph--view-mode--default"> <div class="clearfix text-formatted field field--name-f-text field--type-text-long field--label-hidden field__item"><p>In order to delete an entity in Drupal we can use entity storage to load an entity and then call "delete" method for it.</p> <p> </p> <pre> <code class="language-php">// Delete a node. $node = \Drupal::entityTypeManager()-&gt;getStorage('node')-&gt;load(1); if (!empty($node)) { $node-&gt;delete(); }</code></pre> <p> </p> <p>Or we can load an entity using static method "load" and then remove it.</p> <p> </p> <pre> <code class="language-php">// Delete a node. $node = Node::load(1); if (!empty($node)) { $node-&gt;delete(); }</code></pre> <p> </p> <p>Delete multiple nodes in one operation.</p> <p> </p> <pre> <code class="language-php">\Drupal::entityTypeManager()-&gt;getStorage('node')-&gt;delete([    $nid1 =&gt; $node1,    $nid2 =&gt; $node2, ]);</code></pre> <p> </p> </div> </div> </div> </div> <div class="field field--name-f-tags field--type-entity-reference field--label-hidden field__items"> <div class="field__item btn btn-secondary"><a href="/tags/drupal-9" hreflang="en">Drupal 9</a></div> <div class="field__item btn btn-secondary"><a href="/tags/entity" hreflang="en">Entity</a></div> <div class="field__item btn btn-secondary"><a href="/tags/entity-api" hreflang="en">Entity API</a></div> </div> <div class="field field--name-f-related-items field--type-entity-reference field--label-above list-group list-group-flush"> <div class="field__label">Related items</div> <ul class="field field--name-f-related-items field--type-entity-reference field--label-above list-group list-group-flush field__items"> <li class="field__item list-group-item"><a href="/post/how-create-entity-drupal" hreflang="en">How to create an Entity in Drupal?</a></li> <li class="field__item list-group-item"><a href="/post/how-edit-entity-drupal" hreflang="en">How to edit an Entity in Drupal?</a></li> </ul> </div> <section class="field field--name-f-comments field--type-comment field--label-above comment-wrapper"> </section> Mon, 02 Sep 2019 10:49:30 +0000 LOBsTerr 8 at http://lobsterr.me How to edit an Entity in Drupal? http://lobsterr.me/post/how-edit-entity-drupal <span class="field field--name-title field--type-string field--label-hidden">How to edit an Entity in Drupal?</span> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/user/1" typeof="schema:Person" property="schema:name" datatype="">LOBsTerr</span></span> <span class="field field--name-created field--type-created field--label-hidden">08/30/2019</span> <div class="field field--name-f-content field--type-entity-reference-revisions field--label-hidden field__items"> <div class="field__item"> <div class="paragraph paragraph--type--l-text paragraph--view-mode--default"> <div class="clearfix text-formatted field field--name-f-text field--type-text-long field--label-hidden field__item"><p>In order to edit an entity in Drupal firstly we need to load it. We can use the static method of specific entity class, in the current example it is Node class</p> <p> </p> <pre> <code class="language-php">$node = Node::load(1); </code></pre> <p> </p> <p>We can also use entity storage to load entities</p> <p> </p> <pre> <code class="language-php">// Load single entity $entity = \Drupal::entityTypeManager()-&gt;getStorage('node')-&gt;load(1); // Load multiple entities $entities = \Drupal::entityTypeManager()-&gt;getStorage($entity_type)-&gt;loadMultiple([1, 2, 3]);</code></pre> <p> </p> <p>Then you can set necessary fields and properties of the entity</p> <p> </p> <pre> <code class="language-php">// Call the specific setter $node-&gt;setTitle('new Title'); // Call general set method $node-&gt;set('body', 'Body text'); // Save the entity $node-&gt;save();</code></pre> <p> </p> </div> </div> </div> </div> <div class="field field--name-f-tags field--type-entity-reference field--label-hidden field__items"> <div class="field__item btn btn-secondary"><a href="/tags/drupal-9" hreflang="en">Drupal 9</a></div> <div class="field__item btn btn-secondary"><a href="/tags/entity" hreflang="en">Entity</a></div> <div class="field__item btn btn-secondary"><a href="/tags/entity-api" hreflang="en">Entity API</a></div> </div> <div class="field field--name-f-related-items field--type-entity-reference field--label-above list-group list-group-flush"> <div class="field__label">Related items</div> <ul class="field field--name-f-related-items field--type-entity-reference field--label-above list-group list-group-flush field__items"> <li class="field__item list-group-item"><a href="/post/how-create-entity-drupal" hreflang="en">How to create an Entity in Drupal?</a></li> <li class="field__item list-group-item"><a href="/post/how-delete-entity-drupal" hreflang="en">How to delete entity in Drupal?</a></li> </ul> </div> <section class="field field--name-f-comments field--type-comment field--label-above comment-wrapper"> </section> Fri, 30 Aug 2019 08:10:35 +0000 LOBsTerr 7 at http://lobsterr.me