update中使用db::raw和casts冲突怎么处理?

inventoryBatchs模型中定义了casts

    // 如果注释掉casts则代码正常执行
    protected $casts = [
        'number' => 'integer',
        'price'  => 'integer'
    ];

然后更新模型数据

// 示例代码
InventoryBatch::find(1)->update([
    'amount' => DB::raw('amount + 1'),
    'number' => DB::raw('number + 1')
]);
// 真正的应用场景代码如下:
$purchaseReturn->details->each(function ($detail) use ($request) {
    $detail->inventoryBatch->update(
        $request->transformers($detail)
    );
});

报错信息

[2020-08-17 12:54:17] local.INFO: ErrorException: Object of class Illuminate\Database\Query\Expression could not be converted to int in D:\wwwroot\his\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Concerns\HasAttributes.php:521
Stack trace:
#0 D:\wwwroot\his\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Concerns\HasAttributes.php(521): Illuminate\Foundation\Bootstrap\HandleExceptions->handleError(8, 'Object of class...', 'D:\\wwwroot\\his\\...', 521, Array)
#1 D:\wwwroot\his\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Concerns\HasAttributes.php(1423): Illuminate\Database\Eloquent\Model->castAttribute('number', Object(Illuminate\Database\Query\Expression))
#2 D:\wwwroot\his\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Concerns\HasAttributes.php(1373): Illuminate\Database\Eloquent\Model->originalIsEquivalent('number')
#3 D:\wwwroot\his\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Concerns\HasAttributes.php(1307): Illuminate\Database\Eloquent\Model->getDirty()
#4 D:\wwwroot\his\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Model.php(720): Illuminate\Database\Eloquent\Model->isDirty()
#5 D:\wwwroot\his\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Model.php(666): Illuminate\Database\Eloquent\Model->save(Array)
#6 D:\wwwroot\his\app\Http\Controllers\PurchaseReturnController.php(134): Illuminate\Database\Eloquent\Model->update(Array)
#7 D:\wwwroot\his\vendor\laravel\framework\src\Illuminate\Support\Traits\EnumeratesValues.php(202): App\Http\Controllers\PurchaseReturnController->App\Http\Controllers\{closure}(Object(App\Models\PurchaseReturnDetail), 0)
#8 D:\wwwroot\his\app\Http\Controllers\PurchaseReturnController.php(136): Illuminate\Support\Collection->each(Object(Closure))
#9 [internal function]: App\Http\Controllers\PurchaseReturnController->check(Object(App\Http\Requests\PurchaseReturn\CheckRequest))
#10 D:\wwwroot\his\vendor\laravel\framework\src\Illuminate\Routing\Controller.php(54): call_user_func_array(Array, Array)
#11 D:\wwwroot\his\vendor\laravel\framework\src\Illuminate\Routing\ControllerDispatcher.php(45): Illuminate\Routing\Controller->callAction('check', Array)
#12 D:\wwwroot\his\vendor\laravel\framework\src\Illuminate\Routing\Route.php(239): Illuminate\Routing\ControllerDispatcher->dispatch(Object(Illuminate\Routing\Route), Object(App\Http\Controllers\PurchaseReturnController), 'check')
#13 D:\wwwroot\his\vendor\laravel\framework\src\Illuminate\Routing\Route.php(196): Illuminate\Routing\Route->runController()
#14 D:\wwwroot\his\vendor\laravel\framework\src\Illuminate\Routing\Router.php(685): Illuminate\Routing\Route->run()
#15 D:\wwwroot\his\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(128): Illuminate\Routing\Router->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#16 D:\wwwroot\his\app\Http\Middleware\Permission.php(19): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#17 D:\wwwroot\his\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(167): App\Http\Middleware\Permission->handle(Object(Illuminate\Http\Request), Object(Closure), 'purchase.return...')
#18 D:\wwwroot\his\app\Http\Middleware\Login.php(30): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#19 D:\wwwroot\his\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(167): App\Http\Middleware\Login->handle(Object(Illuminate\Http\Request), Object(Closure))
#20 D:\wwwroot\his\vendor\laravel\framework\src\Illuminate\Routing\Middleware\SubstituteBindings.php(41): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#21 D:\wwwroot\his\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(167): Illuminate\Routing\Middleware\SubstituteBindings->handle(Object(Illuminate\Http\Request), Object(Closure))
#22 D:\wwwroot\his\vendor\laravel\framework\src\Illuminate\Routing\Middleware\ThrottleRequests.php(59): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#23 D:\wwwroot\his\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(167): Illuminate\Routing\Middleware\ThrottleRequests->handle(Object(Illuminate\Http\Request), Object(Closure), 60, '1')
#24 D:\wwwroot\his\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(103): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#25 D:\wwwroot\his\vendor\laravel\framework\src\Illuminate\Routing\Router.php(687): Illuminate\Pipeline\Pipeline->then(Object(Closure))
#26 D:\wwwroot\his\vendor\laravel\framework\src\Illuminate\Routing\Router.php(662): Illuminate\Routing\Router->runRouteWithinStack(Object(Illuminate\Routing\Route), Object(Illuminate\Http\Request))
#27 D:\wwwroot\his\vendor\laravel\framework\src\Illuminate\Routing\Router.php(628): Illuminate\Routing\Router->runRoute(Object(Illuminate\Http\Request), Object(Illuminate\Routing\Route))
#28 D:\wwwroot\his\vendor\laravel\framework\src\Illuminate\Routing\Router.php(617): Illuminate\Routing\Router->dispatchToRoute(Object(Illuminate\Http\Request))
#29 D:\wwwroot\his\vendor\laravel\framework\src\Illuminate\Foundation\Http\Kernel.php(165): Illuminate\Routing\Router->dispatch(Object(Illuminate\Http\Request))
#30 D:\wwwroot\his\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(128): Illuminate\Foundation\Http\Kernel->Illuminate\Foundation\Http\{closure}(Object(Illuminate\Http\Request))
#31 D:\wwwroot\his\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\TransformsRequest.php(21): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#32 D:\wwwroot\his\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(167): Illuminate\Foundation\Http\Middleware\TransformsRequest->handle(Object(Illuminate\Http\Request), Object(Closure))
#33 D:\wwwroot\his\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\TransformsRequest.php(21): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#34 D:\wwwroot\his\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(167): Illuminate\Foundation\Http\Middleware\TransformsRequest->handle(Object(Illuminate\Http\Request), Object(Closure))
#35 D:\wwwroot\his\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\ValidatePostSize.php(27): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#36 D:\wwwroot\his\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(167): Illuminate\Foundation\Http\Middleware\ValidatePostSize->handle(Object(Illuminate\Http\Request), Object(Closure))
#37 D:\wwwroot\his\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode.php(63): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#38 D:\wwwroot\his\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(167): Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode->handle(Object(Illuminate\Http\Request), Object(Closure))
#39 D:\wwwroot\his\vendor\fruitcake\laravel-cors\src\HandleCors.php(37): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#40 D:\wwwroot\his\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(167): Fruitcake\Cors\HandleCors->handle(Object(Illuminate\Http\Request), Object(Closure))
#41 D:\wwwroot\his\vendor\fideloper\proxy\src\TrustProxies.php(57): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#42 D:\wwwroot\his\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(167): Fideloper\Proxy\TrustProxies->handle(Object(Illuminate\Http\Request), Object(Closure))
#43 D:\wwwroot\his\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(103): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#44 D:\wwwroot\his\vendor\laravel\framework\src\Illuminate\Foundation\Http\Kernel.php(140): Illuminate\Pipeline\Pipeline->then(Object(Closure))
#45 D:\wwwroot\his\vendor\laravel\framework\src\Illuminate\Foundation\Http\Kernel.php(109): Illuminate\Foundation\Http\Kernel->sendRequestThroughRouter(Object(Illuminate\Http\Request))
#46 D:\wwwroot\his\public\index.php(55): Illuminate\Foundation\Http\Kernel->handle(Object(Illuminate\Http\Request))
#47 D:\wwwroot\his\server.php(21): require_once('D:\\wwwroot\\his\\...')
#48 {main}  

GitHub上相关讨论

附言 1  ·  3年前

目前定义修改器(getXXXAttribute)也无法解决

《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

没来得及写测试代码,不过建议楼主换一种方法实现(换一种思路写代码)。理由: 修改器 是 Eloquent 提供的,和 DB raw 是两个不一样的东西,要么全部使用 Eloquent ,要么全部使用 raw。
可以参考下文档里面的代码:

$user = App\User::find(1);

$options = $user->options;

$options['key'] = 'value';

$user->options = $options;

$user->save();
3年前 评论
91it (楼主) 3年前
讨论数量: 3

没来得及写测试代码,不过建议楼主换一种方法实现(换一种思路写代码)。理由: 修改器 是 Eloquent 提供的,和 DB raw 是两个不一样的东西,要么全部使用 Eloquent ,要么全部使用 raw。
可以参考下文档里面的代码:

$user = App\User::find(1);

$options = $user->options;

$options['key'] = 'value';

$user->options = $options;

$user->save();
3年前 评论
91it (楼主) 3年前
3年前 评论
91it (楼主) 3年前

file

3年前 评论
91it (楼主) 3年前
JerryBool (作者) 3年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!