2016-05-03 2 views
1

Попытка сделать API с помощью Transaction() для обеспечения большей безопасности для базы данных.Transaction() - Query Builder в laravel 5 ошибка бросания

Код:

DatabaseName::transaction(function() { 

    $CheckExistingData = PostCustomer::select('Mobile')->where('Mobile', $Mobile); 

    return $CheckExistingData; 
    }); 

Ошибка:

BadMethodCallException in Builder.php line 2258: 

Call to undefined method Illuminate\Database\Query\Builder::transaction() 

Поделитесь своими мыслями!

PostCustomer является MODEL

PostCustomer Модель

class PostCustomer extends Model 
{ 
protected $table = "Customer"; 
} 

"Клиент" это имя таблицы.

ответ

1

Я пытался что-то вроде этого, попробуйте с этим кодом

PostCustomer::beginTransaction(); 
try{ 
    $result = true; 
    PostCustomer::commit(); 
}catch(Exception $exception) 
{ 
    PostCustomer::rollBack(); 
    $errormsg = 'Database error!! ' . $exception->getMessage(); 
    $result = false; 
} 

метод транзакции не будет работать так: Смотрите этот https://laravel.com/docs/4.2/database#database-transactions.

Либо вы можете использовать transaction method или you may need to begin a transaction yourself.

+0

фактически PostCustomer является модель и "Клиент" таблица используется здесь. – Sunil

+0

change 'DB' =' PostCustomer' – C2486

+0

Спасибо за эту информацию '@ Rishi, но получив ошибку, когда я изменил название модели на имя db: Class 'App \ Http \ Controllers \ DatabaseName' не найден – Sunil

1

Проблема заключается в том, что метод transaction доступен в Database\Connection, а ваша модель является экземпляром Eloquent.

Таким образом, PostCustomer не имеет способа оплаты. Вы должны вызвать DB (это фасад, который дает вам доступ к Database\Connection и метод transaction

Вы должны сделать что-то вроде этого:..

DB::transaction(function() { 
    $CheckExistingData = PostCustomer::select('Mobile')->where('Mobile', $Mobile); 
    return $CheckExistingData; 
}); 

и импортировать DB фасад конечно

Также вы не требуется try/catch выражение:

Примечание: Любое исключение, вызванное закрытием транзакции, приведет к откату транзакции автоматически.

PS: (только если вы используете MySQL)

Вероятно, с помощью транзакции не достаточно:

SELECT запрос внутри транзакции, само по себе, не является надлежащим образом экранированный от UPDATEs и DELETEs.

(source)

+0

Спасибо за эту замечательную информацию, @Ivanka. По вашему совету я изменил эту модель на имя базы данных, но получаю ошибку, например: «App \ Http \ Controllers \ DatabaseName» не найден – Sunil

+0

@Sunil вы можете изменить свой вопрос и включить внесенные изменения? Похоже на довольно странную проблему, с которой вы столкнулись. –

+0

Я не уверен, что это возможно или не использовать имя Databae прямо здесь, потому что каждый раз, когда я использовал только имя модели. – Sunil