Laravel 迁移 - Model::find($id) 返回 NULL 但 $id 存在于数据库中

Posted

技术标签:

【中文标题】Laravel 迁移 - Model::find($id) 返回 NULL 但 $id 存在于数据库中【英文标题】:Laravel Migration - Model::find($id) return NULL but $id exists in database 【发布时间】:2017-01-01 23:59:49 【问题描述】:

对于一个非常小的迁移,我有一个奇怪的问题。

基本信息:我目前有 3 个项目实例:“Dev PC”(离线)、“Dev Laptop”(离线)和“QS”(在线)

所以最近两天我写了三个不同的迁移。一种导入包含有关 6.000 个模型实例信息的 JSON 文件并将这些模型写入数据库的方法。

第二个(现在失败了)应该向这些模型写入一些新数据,第三个将重写一些数据。

如果这是完美的,不应该在这里讨论。没关系!

所以问题来了:第二次迁移在 QS 阶段失败,但在两个 Dev 阶段都有效。

这是第一个错误

-sh-4.2$ /opt/plesk/php/5.6/bin/php artisan migrate
**************************************
*     Application In Production!     *
**************************************

 Do you really wish to run this command? (yes/no) [no]:
 > yes



  [ErrorException]
  Creating default object from empty value

然后我试了一下

-sh-4.2$ /opt/plesk/php/5.6/bin/php artisan migrate --force --pretend -vvv
6219

  [ErrorException]
  Creating default object from empty value


Exception trace:
 () at /var/www/vhosts/database/migrations/2016_08_25_080129_import_old_adresses.php:28
 Illuminate\Foundation\Bootstrap\HandleExceptions->handleError() at n/a:n/a
 call_user_func() at /var/www/vhosts/vendor/sentry/sentry/lib/Raven/Breadcrumbs/ErrorHandler.php:36
 Raven_Breadcrumbs_ErrorHandler->handleError() at /var/www/vhosts/database/migrations/2016_08_25_080129_import_old_adresses.php:28
 ImportOldAdresses->up() at /var/www/vhosts/vendor/laravel/framework/src/Illuminate/Database/Migrations/Migrator.php:319
 Illuminate\Database\Migrations\Migrator->Illuminate\Database\Migrations\closure() at /var/www/vhosts/vendor/laravel/framework/src/Illuminate/Database/Connection.php:656
 Illuminate\Database\Connection->pretend() at /var/www/vhosts/vendor/laravel/framework/src/Illuminate/Database/Migrations/Migrator.php:320
 Illuminate\Database\Migrations\Migrator->getQueries() at /var/www/vhosts/vendor/laravel/framework/src/Illuminate/Database/Migrations/Migrator.php:295
 Illuminate\Database\Migrations\Migrator->pretendToRun() at /var/www/vhosts/vendor/laravel/framework/src/Illuminate/Database/Migrations/Migrator.php:144
 Illuminate\Database\Migrations\Migrator->runUp() at /var/www/vhosts/vendor/laravel/framework/src/Illuminate/Database/Migrations/Migrator.php:117
 Illuminate\Database\Migrations\Migrator->runMigrationList() at /var/www/vhosts/vendor/laravel/framework/src/Illuminate/Database/Migrations/Migrator.php:86
 Illuminate\Database\Migrations\Migrator->run() at /var/www/vhosts/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/MigrateCommand.php:77
 Illuminate\Database\Console\Migrations\MigrateCommand->fire() at n/a:n/a
 call_user_func_array() at /var/www/vhosts/bootstrap/cache/compiled.php:1257
 Illuminate\Container\Container->call() at /var/www/vhosts/vendor/laravel/framework/src/Illuminate/Console/Command.php:169
 Illuminate\Console\Command->execute() at /var/www/vhosts/vendor/symfony/console/Command/Command.php:256
 Symfony\Component\Console\Command\Command->run() at /var/www/vhosts/vendor/laravel/framework/src/Illuminate/Console/Command.php:155
 Illuminate\Console\Command->run() at /var/www/vhosts/vendor/symfony/console/Application.php:794
 Symfony\Component\Console\Application->doRunCommand() at /var/www/vhosts/vendor/symfony/console/Application.php:186
 Symfony\Component\Console\Application->doRun() at /var/www/vhosts/vendor/symfony/console/Application.php:117
 Symfony\Component\Console\Application->run() at /var/www/vhosts/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php:107
 Illuminate\Foundation\Console\Kernel->handle() at /var/www/vhosts/artisan:36

现在我想看看被触发的 SQL:

-sh-4.2$ /opt/plesk/php/5.6/bin/php artisan migrate --force --pretend -vvv
array:2 [
  0 => array:3 [
    "query" => "alter table `orders` add `oldName` varchar(255) not null, add `oldAdress` varchar(255) not null"
    "bindings" => []
    "time" => 0.0
  ]
  1 => array:3 [
    "query" => "select * from `orders` where `orders`.`id` = ? limit 1"
    "bindings" => array:1 [
      0 => 6219
    ]
    "time" => 0.0
  ]
]

现在这很令人困惑,因为在 DB 上运行查询 select * from orderswhereorders.id = 6219 limit 1 直接导致 1 Entry, Query took 0.0005 seconds.

那么我可以做些什么来调试为什么 laravel 找不到我的数据库条目? 这是迁移:

字符串(“旧名称”); $table->string('oldAdress'); ); // 加载要导入的数据。 $oldOrders = json_decode(File::get('storage/olddata.json'), TRUE); // 更新。 foreach ($oldOrders as $rawOrder) $order = \App\Order::find(intval($rawOrder['id'])); // 这是第一次迭代时的崩溃。 $order->oldName = $rawOrder['oldName']; $order->oldAdress = $rawOrder['oldAdress']; $订单->保存(); /** * 逆转迁移。 * * @return 无效 */ 公共功能向下() Schema::table('orders', function (Blueprint $table) $table->dropColumn('oldName'); $table->dropColumn('oldAdress'); );

【问题讨论】:

【参考方案1】:

好的,我实际上不知道我第一次运行迁移时发生了什么,但进一步的分析可以回答他们自己。截至--pretend 只是模拟查询,Order::find($id) 不会返回任何内容。于是就出现了错误。

我反复思考,最终再次运行与第一次相同的命令 (/opt/plesk/php/5.6/bin/php artisan migrate),它成功了。

【讨论】:

以上是关于Laravel 迁移 - Model::find($id) 返回 NULL 但 $id 存在于数据库中的主要内容,如果未能解决你的问题,请参考以下文章

使用 Modell::find(array()) 时如何在 Laravel 中分页

Laravel框架——增删改查

如何在Laravel中的find()方法中指定两个或更多条件?

Laravel 的 with 方法返回 null

Laravel Response::json() 带数字检查

Laravel:在迁移之前删除迁移:重置