Используя mysqli PHP драйвер, Вы не можете получить insert_id после фиксации.
действительное решение - это:
function add_post($post_data){
$this->db->trans_begin();
$this->db->insert('posts',$post_data);
if( $this->db->trans_status() === FALSE )
{
$this->db->trans_rollback();
return( 0 );
}
else
{
$item_id = $this->db->insert_id();
$this->db->trans_commit();
return( $item_id );
}
}
Источник для структуры кода: https://codeigniter.com/user_guide/database/transactions.html#running-transactions-manually
См. этот вопрос . Короткий ответ заключается в том, что выражения for могут быть более читаемыми. В частности, если у вас много вложенных генераторов, фактический объем того, что вы делаете, становится более ясным, и вам не нужны огромные отступы.
Еще одно замечательное применение for-computing - это внутренний DSL. ScalaQL - отличный пример этого. Он может превратить это
val underAge = for {
p <- Person
c <- Company
if p.company is c
if p.age < 14
} yield p
в это
SELECT p.* FROM people p JOIN companies c ON p.company_id = c.id WHERE p.age < 14
и многое другое.
for-complation - это синтаксический сахар, но это не значит, что они не являются жизненно важными. Обычно они более лаконичны, чем их развернутая форма, что приятно, но, возможно, что более важно, они помогают программистам, использующим императивные языки, использовать функциональные конструкции.
Когда я впервые начал работать со Scala, я часто использовал for-computing, потому что они были мне знакомы. Затем я почти полностью остановился, потому что почувствовал, что использование основных методов было более явным и, следовательно, более ясным. Теперь я вернулся к использованию for-computing, потому что считаю, что они лучше выражают намерение того, что я делаю, а не способы его выполнения.
Вы правы. Понимание - это синтаксический сахар. Я считаю, что лежащие в основе методы более лаконичны и легче читаются, как только вы к ним привыкнете.
Сравните следующие эквивалентные утверждения:
1. for (i <- 1 to 100; if (i % 3 == 0)) yield Math.pow(i, 2)
2. (1 to 100).filter(_ % 3 == 0).map(Math.pow(_, 2))
На мой взгляд, добавление точки с запятой в № 1 отвлекает от ощущения, что это представляет собой одноцепочечное утверждение. Также есть ощущение, что i - это переменная (это 1, или 99, или что-то среднее?), Что отвлекает от в остальном функционального стиля.
Вариант 2 более очевидно представляет собой цепочку вызовов методов для объектов. Каждое звено в цепочке четко заявляет о своей ответственности. Здесь нет промежуточных переменных.
Возможно, для понимания включены для удобства разработчиков, переходящих с Java. Независимо от того, какой вариант будет выбран, зависит от стиля и предпочтений.