Я использую последнюю версию laravel (5.1) в домашней виртуальной машине (бродяга).
Я подключаю свой проект к локальному серверу mariaDB, в котором у меня есть таблица и 2 db-view.
Поскольку я сделал некоторый выбор только в таблицах db-view, я случайно возвращаю эту ошибку:
Общая ошибка: 1615 Подготовленная заявка должна быть пересмотрена
С сегодняшнего дня я всегда получаю эту ошибку, когда вы делаете select только на представлениях db. Если я открою свой phpMyAdmin и сделаю тот же выбор, он вернет правильный результат.
Я попытался открыть php artisan tinker
и выбрать одну запись db-view, но он возвращает ту же ошибку:
// Select one user from user table >>> $user = new App\User => <App\User #000000006dc32a890000000129f667d2> {} >>> $user = App\User::find(1); => <App\User #000000006dc32a9e0000000129f667d2> { id: 1, name: "Luca", email: "luca@email.it", customerId: 1, created_at: "2015-08-06 04:17:57", updated_at: "2015-08-11 12:39:01" } >>> // Select one source from Source db-view >>> $source = new App\Source => <App\Source #000000006dc32a820000000129f667d2> {} >>> $source = App\Source::find(1); Illuminate\Database\QueryException with message 'SQLSTATE[HY000]: General error: 1615 Prepared statement needs to be re-prepared (SQL: select * from `sources` where `sources`.`id` = 1 limit 1)'
Как я могу это исправить? Я прочитал о проблеме с mysqldump (но не в моем случае) и увеличил значение table_definition_cache
но он не уверен, что он будет работать, и я не могу их модифицировать.
Это что-то вроде laravel bug?
Как я могу понять это?
Редактировать:
Как я уже сказал, я добавляю исходный код модели. Source.php:
<?php namespace App; use Illuminate\Database\Eloquent\Model; class Source extends Model { protected $table = 'sources'; /* |-------------------------------------------------------------------------- | FOREIGN KEYS |-------------------------------------------------------------------------- */ /** * * @return [type] [description] */ public function customersList(){ return $this->hasMany("App\CustomerSource", "sourceId", "id"); } /** * * @return [type] [description] */ public function issues(){ return $this->hasMany("App\Issue", "sourceId", "id"); } }
Изменить 2:
Если я выполняю тот же запрос в проекте с помощью mysqli, он работает:
$db = new mysqli(getenv('DB_HOST'), getenv('DB_USERNAME'), getenv('DB_PASSWORD'), getenv('DB_DATABASE')); if($db->connect_errno > 0){ dd('Unable to connect to database [' . $db->connect_error . ']'); } $sql = "SELECT * FROM `sources` WHERE `id` = 4"; if(!$result = $db->query($sql)){ dd('There was an error running the query [' . $db->error . ']'); } dd($result->fetch_assoc());
EDIT 3: Афон 2 месяца, я все еще там. Такая же ошибка и решение не найдено. Я решил попробовать небольшое решение в арицанском вокалисте, но никаких хороших новостей. Я сообщаю, что я пробовал:
Сначала попробуйте получить таблицу:
>>> $user = \App\User::find(1); => App\User {#697 id: 1, name: "Luca", email: "luca.d@company.it", customerId: 1, created_at: "2015-08-06 04:17:57", updated_at: "2015-10-27 11:28:14", }
Теперь попробуйте получить модель таблицы представлений:
>>> $ir = \App\ContentRepository::find(15); Illuminate\Database\QueryException with message 'SQLSTATE[42S02]: Base table or view not found: 1146 Table 'dbname.content_repositories' doesn't exist (SQL: select * from `content_repositories` where `content_repositories`.`id` = 1 limit 1)'
Когда contentRepository не имеет правильной настройки имени таблицы внутри модели ContentRepository.php:
>>> $pdo = DB::connection()->getPdo(); => PDO {#690 inTransaction: false, errorInfo: [ "00000", 1146, "Table 'dbname.content_repositories' doesn't exist", ], attributes: [ "CASE" => NATURAL, "ERRMODE" => EXCEPTION, "AUTOCOMMIT" => 1, "PERSISTENT" => false, "DRIVER_NAME" => "mysql", "SERVER_INFO" => "Uptime: 2513397 Threads: 12 Questions: 85115742 Slow queries: 6893568 Opens: 1596 Flush tables: 1 Open tables: 936 Queries per second avg: 33.864", "ORACLE_NULLS" => NATURAL, "CLIENT_VERSION" => "mysqlnd 5.0.11-dev - 20120503 - $Id: id_here $", "SERVER_VERSION" => "5.5.5-10.0.17-MariaDB-1~wheezy-wsrep-log", "STATEMENT_CLASS" => [ "PDOStatement", ], "EMULATE_PREPARES" => 0, "CONNECTION_STATUS" => "localiphere via TCP/IP", "DEFAULT_FETCH_MODE" => BOTH, ], } >>>
ИЗМЕНИТЬ ТАБЛИЦУ СТОИМОСТЬ ВНУТРИ модели ContentRepository.php:
>>> $ir = \App\ContentRepository::find(15); Illuminate\Database\QueryException with message 'SQLSTATE[HY000]: General error: 1615 Prepared statement needs to be re-prepared (SQL: select * from `contentRepository` where `contentRepository`.`id` = 15 limit 1)'
Когда это будет правильно, обратите внимание на «errorInfo», который отсутствует :
>>> $pdo = DB::connection()->getPdo(); => PDO {#690 inTransaction: false, attributes: [ "CASE" => NATURAL, "ERRMODE" => EXCEPTION, "AUTOCOMMIT" => 1, "PERSISTENT" => false, "DRIVER_NAME" => "mysql", "SERVER_INFO" => "Uptime: 2589441 Threads: 13 Questions: 89348013 Slow queries: 7258017 Opens: 1604 Flush tables: 1 Open tables: 943 Queries per second avg: 34.504", "ORACLE_NULLS" => NATURAL, "CLIENT_VERSION" => "mysqlnd 5.0.11-dev - 20120503 - $Id: id_here $", "SERVER_VERSION" => "5.5.5-10.0.17-MariaDB-1~wheezy-wsrep-log", "STATEMENT_CLASS" => [ "PDOStatement", ], "EMULATE_PREPARES" => 0, "CONNECTION_STATUS" => "localIPhere via TCP/IP", "DEFAULT_FETCH_MODE" => BOTH, ], }
Показать таблицы db:
>>> $tables = DB::select('SHOW TABLES'); => [ {#702 +"Tables_in_dbname": "table_name_there", }, {#683 +"Tables_in_dbname": "table_name_there", }, {#699 +"Tables_in_dbname": "table_name_there", }, {#701 +"Tables_in_dbname": "table_name_there-20150917-1159", }, {#704 +"Tables_in_dbname": "contentRepository", */ VIEW TABLE IS THERE!!!! /* }, {#707 +"Tables_in_dbname": "table_name_there", }, {#684 +"Tables_in_dbname": "table_name_there", }, ]
Попробуйте с обычным выбором:
>>> $results = DB::select('select * from dbname.contentRepository limit 1'); Illuminate\Database\QueryException with message 'SQLSTATE[HY000]: General error: 1615 Prepared statement needs to be re-prepared (SQL: select * from dbname.contentRepository limit 1)'
Попробуйте неподготовленный запрос:
>>> DB::unprepared('select * from dbname.contentRepository limit 1') => false
Попробуйте второй раз неподготовленный запрос:
>>> DB::unprepared('select * from dbname.contentRepository limit 1') Illuminate\Database\QueryException with message 'SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll(). Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute. (SQL: select * from dbname.contentRepository limit 1)'
Попробуйте PDOStatement :: fetchAll ():
>>> DB::fetchAll('select * from dbname.contentRepository limit 1'); PHP warning: call_user_func_array() expects parameter 1 to be a valid callback, class 'Illuminate\Database\MySqlConnection' does not have a method 'fetchAll' in /Users/luca/company/Laravel/dbname/vendor/laravel/framework/src/Illuminate/Database/DatabaseManager.php on line 296
Попробуйте второй PDOStatement :: fetchAll ():
>>> $pdo::fetchAll('select * from dbname.contentRepository limit 1'); [Symfony\Component\Debug\Exception\FatalErrorException] Call to undefined method PDO::fetchAll()
Попробуйте заявление …:
>>> $pdos = DB::statement('select * from dbname.contentRepository limit 1') Illuminate\Database\QueryException with message 'SQLSTATE[HY000]: General error: 1615 Prepared statement needs to be re-prepared (SQL: select * from dbname.contentRepository limit 1)'
спасибо
Кажется, что
'options' => [ \PDO::ATTR_EMULATE_PREPARES => true ]
Внутри файла projectName/config/database.php
в конфигурации БД. Это будет так:
'mysql' => [ 'driver' => 'mysql', 'host' => env('DB_HOST', 'localhost'), 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', 'prefix' => '', 'strict' => false, 'options' => [ \PDO::ATTR_EMULATE_PREPARES => true ] ],
Laravel 5.1. Надеюсь, это поможет!
Похоже, что это ошибка MySQL , которая была задокументирована.
Редактировать:
Используется ли ваша модель с использованием «id» в качестве первичного ключа? Мне нравится явно указывать первичный ключ в модели, даже если это так.
protected $primaryKey = 'id'; // If different than id, definitely need to set the column here
Вы также можете попробовать комментировать функции hasMany()
и повторить попытку. Иногда Laravel может делать странные вещи на eagerLoad, особенно если есть много записей, к которым он пытается сопоставить.