更新我的Post
模型时,我运行:
$post->title = request('title');
$post->body = request('body');
$post->save();
这不更新我的帖子。但它应该根据the Laravel docs on updating Eloquent models。 为什么我的模型没有更新?
save
succeeded的结果为true
。 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
与之前相同的帖子没有更新后的数据。
答案 0 :(得分:3)
由于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('/');
}
答案 1 :(得分:3)
检查数据库表,如果“ id”列为大写的“ ID”。将其更改为小写允许我的save()方法起作用。
答案 2 :(得分:2)
我遇到了同样的问题,改变了我获取模型的方式就解决了它!
即使一切都按照您所说的那样工作,也不会保存:
$user = User::find($id)->first();
这有效:
$user = User::find($id);
答案 3 :(得分:1)
在dd()
内运行DB::transaction
会导致回滚,并且数据库中的数据不会更改。
原因是,该事务只会在最后保存对数据库的更改。因此,运行“ dump and die”操作自然会导致脚本停止,因此不会更改数据库。
答案 4 :(得分:1)
您必须确保正在调用save()
的实例具有属性id
答案 5 :(得分:0)
试试这个
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('/');
}
答案 6 :(得分:0)
我有相同的结果,结果是因为我没有主键就过滤了输出列。
$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();
在审阅时具有完美的意义,如果没有主键可用,则update命令将显示为Null。
答案 7 :(得分:0)
根据我的经验,如果您从数据库中选择一个Eloquent模型,并且primary_key
列不属于所获取的列,则您的$model->save()
将返回true,但不会将任何内容持久化到数据库中。 / p>
因此,与其做\App\Users::where(...)->first(['email'])
,不做\App\Users::where(...)->first(['id','email'])
,其中id
是目标表上定义的primary_key
。
如果仅检索几列所获得的(有时是微优化)对您而言并不真正重要,那么您可以执行\App\Users::where(...)->first()
来获取所有列,在这种情况下,您无需费心primary_key
列的名称,因为将提取所有列。
答案 8 :(得分:0)
如果主键不是 id,请检查您的表(“列名应仅使用小写字母”),如果您使用不同的键设置列名,然后像这样将代码放入模型中
protected $primaryKey = 'Id';
答案 9 :(得分:0)
用于save()方法来更新或删除,如果数据库的主键不是“id”。需要在模型中声明属性primaryKey = "",它会起作用
答案 10 :(得分:-1)
我一直遇到相同的问题,并找到了解决方法。我发现无法在save()
模板上名为{{ generateUrl() }}
的函数中home.blade.php
进行模型建模。有效的方法是将save()
调用移到return
模板的控制器上。 (即,在视图home.blade.php
之前进行save()
的访问,然后仅在return
内执行读取操作。)
我正在(并且正在)生成{{ generateUrl() }}
,以在页面加载时放入URL:
state
以下是无效的内容。
<!--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()
的{{1}}时,才发现它与URL中的User
不匹配。
这是起作用的内容。
我没有试图在组装页面时state
state
,而是生成了save()
,User
d,然后渲染了页面:
state
在根目录下着陆将使您进入save()
的{{1}}功能:
// routes/web.php
Route::get('/', 'HomeController@index');
然后,当生成URL时,我不必index()
HomeController.php
,只需从中读取:
// 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');
}
这有效!唯一的区别(据我所知)是我在页面组装开始之前save()
(而不是在页面组装期间){@ 1}}进行建模。