2015-06-12 3 views
1

При совершении транзакции в cakephp3 и добавлении запроса get() внутри все работает нормально. Но почему запрос find() не выполняется внутри транзакции?Cakephp3 transaction find query

Я следующий контроллер в cakephp3:

<?php 
namespace App\Controller; 

use Cake\Core\Configure; 
use Cake\Network\Exception\NotFoundException; 
use Cake\View\Exception\MissingTemplateException; 

use Cake\Network\Session; 
use Cake\Event\Event; 

use Cake\Network\Http\Client; 
use Cake\ORM\TableRegistry; 
use Cake\Datasource\ConnectionManager; 

class DashboardController extends AppController { 
     public function index(){ 
      $conn = ConnectionManager::get('default'); 

      $testModel = TableRegistry::get('Tests'); 

      $select1=array(); 
      $select2 = array(); 
      $saved = array(); 
      $conn->transactional(function ($connection)use(&$testModel,&$select1,&$select2,&$saved) { 
       $select1 = $testModel->find('all')->where(['id' => 2]); // article with id 12 

       $select2 = $testModel->get(1); 
       $select2->content = 'foo'; 
       $saved = $testModel->save($select2); 
      }); 
     } 

    } 
?> 

Я бы ожидать, чтобы получить это в SQL-Log:

BEGIN 
SELECT Tests.id AS `Tests__id`, Tests.content AS `Tests__content` FROM tests Tests WHERE id = 2 
SELECT Tests.id AS `Tests__id`, Tests.content AS `Tests__content` FROM tests Tests WHERE Tests.id = 1 LIMIT 1 
UPDATE tests SET content = 'foo' WHERE id = 1 
COMMIT 

Но вместо этого я получаю:

BEGIN 
SELECT Tests.id AS `Tests__id`, Tests.content AS `Tests__content` FROM tests Tests WHERE Tests.id = 1 LIMIT 1 
UPDATE tests SET content = 'foo' WHERE id = 1 
COMMIT 
SELECT Tests.id AS `Tests__id`, Tests.content AS `Tests__content` FROM tests Tests WHERE id = 2 

ответ

1

Поскольку он отлично работает для меня, я подозреваю, что у вас есть дополнительный запрос за пределами транзакционного обратного вызова, который также выглядит f или id = 2, так как запрос, сгенерированный указанным вами вызовом find(), никогда не будет выполнен, так как запросы анализируются лениво.

Пока вы только что создали объект запроса, а также для того, чтобы на самом деле выполнить его, вам придется позвонить all(), first(), toArray(), и т.д .., или итерацию над ним.

Смотрите также Cookbook > ...ORM > Query Builder > How Are Queries Lazily Evaluated

+0

удивительным, спасибо! ключевым словом была ленивая загрузка. запрос выполняется после транзакции, потому что я обращался к результатам запроса там. благодаря! –

Смежные вопросы