Артем

Артем

Был в сети 23 марта 2022, 14:24
Заказы не принимаю
Справедливости ради, я бы поспорил про join.
IN — еще большее зло, если в нем указана целая простыня (тысячи или десятки тысяч) id.
Вот ради интереса копипастнул себе на один из проектов оба варианта и, как я и ожидал, второй существенно быстрее.
На проекте 29705 товаров.
Ну и я заменил getCollection на getCount, потому что получать 30к объектов — самоубийство, даже через более оптимальный getIterator.

Вариант с IN:
Total time: 0.7136 s
Вариант с join:
Total time: 0.4630 s
Но вариант с IN может оказаться действительно быстрее там, где небольшой перечень id, тут согласен.
Я выше вполне себе ясно написал, где оно хранится.

Значение по умолчанию придумано не для выборок по нему, а для удобства в админке, о чем говорит название поля в таблице тв — default_text
Очевидно, что здесь идет речь о том, что оно не добавляется в modTemplateVarResource.
ну так все правильно, значения у этих тв не менялись, что выводить-то?

еще раз, значение по умолчанию сделано не для выборки по нему, оно не добавляется в базу, наоборот, если установлено такое значение, то оно удаляется из базы, потому что оно «по умолчанию».

из этого следует, что если вы ставите значение по умолчанию 1, то оно никогда не попадет в бд
следовательно, если значения в бд нет, то значит оно = 1, если есть, то 0
Конечно, значения по умолчанию в БД не будет, откуда ему там взяться?
Представьте, что у вас 50000 ресурсов и вы добавили значение по умолчанию, не будут же они проставляться для 50000 ресурсов, логично?

Значение по умолчанию придумано не для выборок по нему, а для удобства в админке, о чем говорит название поля в таблице тв — default_text

Делайте исключающую выборку через :!=
Да, есть вариант делать unique по двум и более колонкам.
Лично я не вижу необходимости в этой схеме наследоваться от xPDOSimpleObject.
Используйте xPDOObject, указывайте эти 2 поля как primary & unique, добавив такой индекс

<index alias="PRIMARY" name="PRIMARY" primary="true" unique="true" type="BTREE">
        <column key="order_id" length="" collation="A" null="false" />
        <column key="field_id" length="" collation="A" null="false" />
</index>
Обновил ответ, изначально немного не так понял ваше сообщение.
Так а где в вашей таблице указано, что это primary/unique поля? Конкретно с вашей схемой в таблице может содержаться хоть 20 записей с одинаковыми значениями order_id и field_id. Добавьте индекс для этих полей, указав там, что это primary & unique (в случае с xPDOObject) или просто unique (в случае xPDOSimpleObject).
Все правильно, уже имеющиеся данные сборщиком не удаляются, это нужно делать самостоятельно. Для удаления сущностей я написал такой метод:
/**
 * Remove objects
 */
protected function remove()
{
    /** @noinspection PhpIncludeInspection */
    $removed = include($this->config['elements'] . 'remove.php');
    if (!is_array($removed)) {
        $this->modx->log(modX::LOG_LEVEL_ERROR, 'Invalid structure detected on \'Remove\' source');

        return;
    }

    $count = 0;
    foreach ($removed as $className => $conditions) {
        /** @var xPDOIterator $objects */
        if ($objects = $this->modx->getIterator($className, $conditions)) {
            /** @var xPDOObject $object */
            foreach ($objects as $object) {
                $count += (int) $object->remove();
            }
        }
    }
    $this->modx->log(modX::LOG_LEVEL_INFO, $count . ' items have been removed');
}
Соответственно, в папку elements добавляется новый файлик — remove.php, где указываются класс сущности в качестве ключа и условия в качестве значения.
return [
    'modResource' => ['id' => 1],
    'modTemplate' => ['id' => 1],
];
Естественно, с этим файликом нужно быть аккуратным и понимать, что указывать, а также не забывать его очищать для новых проектов.

Для удаления файлов обычно хватает синхронизации в IDE, которая показывает расхождения между удаленным и локальным серверами.
проблема не в том, что modx умирает, проблема в том, что вы не умеете искать информацию, которая находится у вас под носом: modx.pro/help/5645
вам даже ключевое слово для поиска подсказали по последней ссылке — SQL_OR
достаточно было просто загуглить SQL_OR modx
Ответ касаемо modAccess гуглится буквально за 30 секунд:
opengeek Reply #2, 7 years, 1 month ago
It's a known bug and is harmless. modAccess is an abstract class which all the modAccess tables use and it does not have a table itself.

Остальное — не ошибки, а уведомление о том, что объект удален, о чем говорит константа LOG_LEVEL_INFO.