Как получить id товара(commerce) по значению поля?

Аватар пользователя svisch svisch 28 сентября в 11:48

Доброго дня. ИМХО пытаюсь делать так, но судя по поведению скрипта этот способ неверный:

<?php
$prod_id 
= \Drupal::entityQuery('commerce_product')->condition('field_artikul'$artikul)->execute();
?>

В то время как получение id атрибута таким же способом у меня сработало:

<?php
$size_attr_id 
= \Drupal::entityQuery('commerce_product_attribute_value')
            ->
condition('attribute''razmer_stelki')
            ->
condition('name'$size)
             ->
execute();
?>

Получил через запрос к БД:

<?php
$query 
= \Drupal::database()->select('commerce_product__field_artikul''с');
        
$query->addField('c''entity_id');
        
$query->condition('c.field_artikul_value'$artikul);
        
$pid $query->execute()->fetchField();
?>

Но все таки хотелось узнать как это сделать через сущность. Догадываюсь, что в моем коде получаю какой-объект а не id.

Пользуясь случаем хотел еще спросить как отлаживать код? Например, надо посмотреть что пришло в переменную. print_r не работает. Попадался на глаза Devel, но пока не понял как им пользоваться.

Лучший ответ

Аватар пользователя OldWarrior OldWarrior 29 сентября в 16:20

svisch wrote: Догадываюсь, что в моем коде получаю какой-объект а не id.

Ещё раз пересмотрел ваш код. Кажется, проблема проще. Добавьте reset() .

<?php
$prod_id 
= \Drupal::entityQuery('commerce_product')->condition('field_artikul'$artikul)->execute();
$prod_id reset($prod_id);
?>

Комментарии

Аватар пользователя OldWarrior OldWarrior 29 сентября в 16:12
1

svisch wrote: судя по поведению скрипта этот способ неверный

Получайте вариации товара, а не товар.

svisch wrote: print_r не работает

Вообще-то должен, хоть это и не по феншую. Без devel можно ещё <?php \Drupal::messenger()->addMessage(var_export($MY_VARTRUE)); ?>

svisch wrote: не понял как им пользоваться

<?php dpm($MY_VAR); ?> в общем случае.

Аватар пользователя svisch svisch 29 сентября в 23:34

OldWarrior wrote: Получайте вариации товара, а не товар.

Да у меня логика загрузки товаров из csv такова, что в каждой строке разная вариация и артикул, означающий товар, который может присутствовать в нескольких вариациях. И обрабатывая вариации я проверяю есть ли уже товар с этим артикулом и если он есть, надо загрузить сущность этого товара и добавить данную вариацию, а для того, чтобы это сделать надо знать id товара. Как то так))

За отладку спасибо)

Аватар пользователя OldWarrior OldWarrior 29 сентября в 16:20

svisch wrote: Догадываюсь, что в моем коде получаю какой-объект а не id.

Ещё раз пересмотрел ваш код. Кажется, проблема проще. Добавьте reset() .

<?php
$prod_id 
= \Drupal::entityQuery('commerce_product')->condition('field_artikul'$artikul)->execute();
$prod_id reset($prod_id);
?>
Аватар пользователя svisch svisch 29 сентября в 23:36

Не сработало. Все равно ошибка, в то время как с версией прямого обращения к таблице все ок. А что это за функция reset? Что-то не встречал ничего про нее.

Аватар пользователя OldWarrior OldWarrior 30 сентября в 0:19
1

Метод ::entityQuery() возвращает множество (т.е. массив) идентификаторов. Вызов типа reset($result) возвращает (помимо прочих действий) первое значение массива (в вашем случае оно же и единственное). В этой связи мне не совсем понятно, как работает ваш "удачный" второй пример.

Аватар пользователя svisch svisch 1 октября в 22:20

Самого червяк изнутри съедал что не так, в то время как должно работать. Проверил еще раз и о чудо - все ок!) Видимо где-то в первый раз ошибся. Спасибо!!