Опрос: $db->insert() и ON DUPLICATE в вашем любимом квери билдере или ORM

Фанат

oncle terrible
Команда форума
Мне для статистики хотелось бы знать, кто как извращается.

Вот у нас есть хелпер метод insert($table,$data);
И понадобилось нам сделать запрос с ON DUPLICATE.
Кто как выходит из положения?

Если не в лом, то можно еще рассказать про $db->delete() (если есть) и джойн.
 

ksnk

прохожий
PHP:
ENGINE::db()->insert('insert into ?k (?[?k]) values (?2[?2])
            on duplicate key set ?2[?k=values.?1k]'
            ,'x_table'
            ,array('one'=>1,'two'=>2,'three'=>'облом')))
        );
Два параметра - table и data
запрос получается такой:
insert into `x_table` (`one`,`two`,`three`) values (1,2,"облом")
on duplicate key set `one`=values.`one`,`two`=values.`two`,`three`=values.`three`
 

ksnk

прохожий
Или вопрос про "чисто построители"?
Судя по YII - полный (не использующий sql во входных данных) построитель, дело не для самодельной реализации и для немаленьких проектов ...
 

Фанат

oncle terrible
Команда форума
Или вопрос про "чисто построители"?
Да, именно про них :)
У меня есть предположение, как это работает, но опыта нету, поэтому хочется подтверждения от тех, кто плотно использует в работе.

А твоя идея с массивами мне все больше и больше нравится. Но вот скобки пугают. поэтому думаю только литералы умножать модификатором.
 

Фанат

oncle terrible
Команда форума
"сделать" - не совсем.

просто цель опроса - не решить задачу, а узнать используемые варианты решений.
А точнее - варианты, предлагаемые различными фреймворками

Ну то есть, если расширить фреймворк методом - то да.
Но в первую очередь интересуют не те решения, которые "как я бы сделал", а те, которые либо предлагаются фреймворком из коробки, либо являются "родными" для него.
Причем в первую очередь, конечно, хотелось бы услышать варианты от тех, кто уже сталкивался с такой задачей, или знает точно, как ее решать.

интересует - я, наверное, должен был сразу это сказать - методология решения подобных задач в целом, а не решение конкретной задачи "insert on duplicate"
 

ksnk

прохожий
Вопрос про форму?
insert - финальный метод. Он сразу запускает выполнение. Чтобы добить его полезностяи - можно разбавить акт построения промежуточный объектом
PHP:
$db->sqlbuilder
   ->insert($table,$data)
   ->onDuplicateKeyUpdate(/** cписок полей для апдейта + специальные функции для других полей*/ 
                 array('count'=>'count+1','description','value'))
   ->execute();
 

AmdY

Пью пиво
Команда форума
Фанат
квери билдеры и ORM дают 99% нужного функционала, а всё остальное можно делать через нативные запросы через DBAL
http://stackoverflow.com/questions/302544/is-there-a-way-to-do-an-insert-on-duplicate-key-udpate-in-zend-framework
PHP:
$sql = "INSERT INTO sometable (id, col2, col3) VALUES (?, ?, ?)
  ON DUPLICATE KEY UPDATE id = ?, col2 = ?, col3 = ?";

$values = array("id"=>1, "col2"=>327, "col3"=>"active");

$db->query($sql, array_merge(array_values($values), array_values($values)));
правильнее набрасать отдельный метод https://gist.github.com/leek/1942116

С другой стороны это не совсем хорошо с точки зрения QB и ORM, которые не должны заточиваться под конкретный сторадж и вернее было бы делать find, а затем insert-update, ведь действие ON DUPLICATE, NOW, filed = filed + 1 - это магия происходящая внутри базы и мы теряем контроль над данными. т.к. база уже не соответствует данным в Identity map или кешах.
 

Фанат

oncle terrible
Команда форума
Вопрос про форму?
insert - финальный метод. Он сразу запускает выполнение.
Это, как я понимаю, решение из головы?
Меня интересуют существующие.
В доктрине, как я понимаю, такого нет, и надо писать rawSQL.
Вообще, погуглить я могу. Но интересует живой опыт
 

Фанат

oncle terrible
Команда форума
Фанат
правильнее набрасать отдельный метод https://gist.github.com/leek/1942116
О, отлично!
Это именно то что надо!
С другой стороны это не совсем хорошо с точки зрения QB и ORM, которые не должны заточиваться под конкретный сторадж и вернее было бы делать find, а затем insert-update, ведь действие ON DUPLICATE, NOW, filed = filed + 1 - это магия происходящая внутри базы и мы теряем контроль над данными. т.к. база уже не соответствует данным в Identity map или кешах.
И это тоже!
Вот за эти два абзаца - огромное спасибо
 

WMix

герр M:)ller
Партнер клуба
в доктрине можно написать просто save() она сама разберется добавлять или обновлять.
 

Ragazzo

TDD interested
Фанат
там наверняка обычный наблюдатель + UnitOfWork недоделанный :D
 

WMix

герр M:)ller
Партнер клуба
Фанат
по идеи доктрина сама генерит sql-schema на основании описанного xml, yaml или пхп а значит должна знать о существовании conditions (конечно их нужно 1 раз описать).
но это не будет оптимальным запросом, это будет вероятнее всего цикл с последовательными update и insert запросами.
 

WMix

герр M:)ller
Партнер клуба
MiksIr
я думаю да! я работал с proppel и с Hibernate могу ошибаться
 

fixxxer

К.О.
Партнер клуба
С другой стороны это не совсем хорошо с точки зрения QB и ORM, которые не должны заточиваться под конкретный сторадж
Ну зачем вот этот буллшит? Ты же сам прекрасно понимаешь, что нет никаких абстракций от субд в реальном мире
 
  • Like
Реакции: AmdY
Сверху