Laravel Eloquent $model->save() 不保存但没有错误
Posted
技术标签:
【中文标题】Laravel Eloquent $model->save() 不保存但没有错误【英文标题】:Laravel Eloquent $model->save() not saving but no error 【发布时间】:2018-04-05 19:14:39 【问题描述】:更新我的Post
模型时,我运行:
$post->title = request('title');
$post->body = request('body');
$post->save();
这不会更新我的帖子。但它应该根据the Laravel docs on updating Eloquent models。 为什么我的模型没有更新?
我没有收到任何错误。 帖子未在数据库中更新。 除了没有在数据库中更新之外,没有其他任何奇怪的地方。没有错误。行为正常。 running this test to see ifsave
succeeded 的结果是true
。
This Laravel thread 没有帮助
Post
模特:
class Post extends Model
protected $fillable = [
'type',
'title',
'body',
'user_id',
];
....
Post
控制器:
public function store($id)
$post = Post::findOrFail($id);
// Request validation
if ($post->type == 1)
// Post type has title
$this->validate(request(), [
'title' => 'required|min:15',
'body' => 'required|min:19',
]);
$post->title = request('title');
$post->body = request('body');
else
$this->validate(request(), [
'body' => 'required|min:19',
]);
$post->body = request('body');
$post->save();
return redirect('/');
奖金信息
运行dd($post->save())
返回true
。
跑步
$post->save();
$fetchedPost = Post::find($post->id);
dd($fetchedPost);
告诉我$fetchedPost
与之前的帖子相同没有更新数据。
【问题讨论】:
您确定在 POST 模型下有“body”字段吗? @MoeenBasra 是的,对不起!我已经清理了其他代码以使其更具可读性和相关性(删除了不相关的部分,例如我已经验证过的代码清理等),但我忘记了更改该变量。 什么返回dd($post->save())
?
@IvankaTodorova dd($post->save())
返回true
。我在问题中添加了这个。
注入到 store 函数或请求助手的 $request 返回相同的东西。由于请求与带有容器的单例模式绑定。
【参考方案1】:
如果“id”列是大写“ID”,请检查您的数据库表。将其更改为小写允许我的 save() 方法工作。
【讨论】:
您不必更改它。您可以通过在模型中添加protected $primaryKey = 'Id';
来定义模型中的主键名称。如果主键是“Id”而不是“id”
这是我的问题,我正在研究一个存在的数据库,并且 id 不称为 Id 或 ID,而是完全不同的东西。让这难以捉摸的是我正在使用 `protected $primaryKey = 'myid'; ` 而且查询工作正常,但如果不是完全匹配,它不会保存,我的表的 ID 是大写的,改变了它,瞧,问题解决了,你的评论让我大开眼界。
该死的 MSSQL 不区分大小写!找到模型但 Eloquent 无法正确保存。
而不是从protected $primaryKey = 'Id';
模型的db更改值【参考方案2】:
我有同样的结果,结果是因为我过滤了没有主键的输出列。
$rows = MyModel::where('...')->select('col2', 'col3')->get();
foreach($rows as $row)
$rows->viewed = 1;
$rows->save();
固定为
$rows = MyModel::where('...')->select('primary_key', 'col2', 'col3')->get();
在审查时非常有意义,如果没有可用的主键,更新命令将为 Null。
【讨论】:
这也是我遇到问题的原因。谢谢! 这也吸引了我。必须确保在模型中包含主键才能使用save()
更新它。从来不知道。【参考方案3】:
我遇到了同样的问题,更改获取模型的方式解决了它!
即使一切都按照你所说的那样正常工作,但没有保存:
$user = User::find($id)->first();
这是有效的:
$user = User::find($id);
【讨论】:
记住 find 方法和 save 一起使用是有用的,但对于其他一些方法 save 不起作用...还要记住 find 只使用 primaryKey【参考方案4】:您必须确保您调用save()
的实例具有id
属性
【讨论】:
在显示的代码上,他在做$post = Post::findOrFail($id);
,所以它必须有一个id集【参考方案5】:
自从 Laravel 5.5 laravel 改变了一些验证机制我想你需要尝试这种方式。
public function store(Request $request, $id)
$post = Post::findOrFail($id);
$validatedData = [];
// Request validation
if ($post->type == 1)
// Post type has title
$validatedData = $request->validate([
'title' => 'required|min:15',
'body' => 'required|min:19',
]);
else
$validatedData = $request->validate([
'body' => 'required|min:19',
]);
$post->update($validatedData);
return redirect('/');
【讨论】:
你能在$post->update()
之前通过$validatedData
的转储吗;【参考方案6】:
在DB::transaction
中运行dd()
会导致回滚,并且数据库中的数据不会改变。
原因是,该事务只会在最后保存对数据库的更改。因此,运行“dump and die”的行为自然会导致脚本停止,因此不会更改数据库。
【讨论】:
【参考方案7】:如果数据库的主键不是“id”,则使用 save () 方法更新或删除。需要在模型中声明属性primaryKey = "",才会生效
【讨论】:
【参考方案8】:试试这个
public function store($id,Request $request)
$post = Post::findOrFail($id);
// Request validation
if ($post->type == 1)
// Post type has title
$request->validate([
'title' => 'required|min:15',
'body' => 'required|min:19',
]);
$post->update([
'title' => request('title');
'body' => request('body');
]);
else
$request->validate([
'body' => 'required|min:19',
]);
$post->update([
'body' => request('body');
]);
return redirect('/');
【讨论】:
【参考方案9】:根据我的经验,如果您从 db 中选择 Eloquent 模型,并且 primary_key
列不是获取的列的一部分,您的 $model->save()
将返回 true,但不会将任何内容保存到数据库中。
因此,不要使用\App\Users::where(...)->first(['email'])
,而是使用\App\Users::where(...)->first(['id','email'])
,其中id
是目标表上定义的primary_key
。
如果通过仅检索几列实现的(有时是微优化)对您来说并不重要,您可以通过执行 \App\Users::where(...)->first()
来获取所有列,在这种情况下您无需担心名称primary_key
列,因为所有列都将被提取。
【讨论】:
【参考方案10】:如果主键不是 id(“列名只能是小写字母”),请检查您的表,如果您使用不同的键设置列名,然后像这样在模型中输入代码
protected $primaryKey = 'Id';
因此,如果您的列名包含大写字母,这也可能是您的情况的可能解决方案之一。 是的,这对我来说很好, 你应该有小写字母的列名, 如果您没有在模型文件中提及它,主要用于您的模型将尝试访问数据库的 primaryKey。
【讨论】:
【参考方案11】:我遇到了同样的问题并找到了解决方法。我发现我无法在 home.blade.php
模板上名为 generateUrl()
的函数中 save()
我的模型。起作用的是将save()
调用移动到return
s home.blade.php
模板的控制器。 (IE,save()
ing之前的view是return
ed,那么只在 generateUrl()
内执行读操作。)
我(现在)正在生成一个state
以在页面加载时输入一个 URL:
<!--views/home.blade.php-->
<a href=" EveAuth::generateUrl() ">Add Character</a>
以下是无效的。
// Providers/EveAuth.php
function generateUrl()
$authedUser = auth()->user();
if (!$authedUser)
return "#";
$user = User::find($authedUser->id);
$user->state = str_random(16);
$user->save();
$baseUrl = 'https://login.eveonline.com/oauth/authorize?state=';
return $baseUrl . $user->state;
这可以从数据库中find()
User
,但无法save()
返回。没有产生错误。该功能似乎可以正常工作...直到我后来尝试阅读User
的state
,发现它与URL中的state
不匹配。
这是有效的。
在组装页面时,我没有尝试save()
我的User
,而是生成了state
、save()
d,然后渲染了页面:
// routes/web.php
Route::get('/', 'HomeController@index');
登陆根目录会跳转到HomeController.php
的index()
函数:
// Controllers/HomeController.php
public function index()
$authedUser = auth()->user();
if ($authedUser)
$user = User::find($authedUser->id);
$user->state = str_random(16);
$user->save();
return view('home');
然后,生成URL时,我不必save()
User
,只读取它:
// Providers/EveAuth.php
function generateUrl()
$authedUser = auth()->user();
$user = User::find($authedUser->id);
$baseUrl = 'https://login.eveonline.com/oauth/authorize?state=';
return $baseUrl . $user->state;
这行得通!唯一的区别(据我所知)是我在页面组装开始之前save()
ing 模型,而不是在页面组装期间。
【讨论】:
以上是关于Laravel Eloquent $model->save() 不保存但没有错误的主要内容,如果未能解决你的问题,请参考以下文章
Laravel Eloquent ORM 数据model操作
Lumen (Laravel) Eloquent php artisan make:model 未定义
需要将查询转换为 Eloquent Model laravel
如何在Laravel 4中使用Eloquent Model增加列