Laravel Eloquent $model-> save() не сохраняется, но без ошибок
При обновлении модели Post
я запускаю:
$post->title = request('title');
$post->body = request('body');
$post->save();
Это не обновляет мой пост. Но это должно в соответствии с документами Laravel по обновлению моделей Eloquent. Почему моя модель не обновляется?
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
- это то же сообщение, что и раньше, без обновленных данных.
Ответы
Ответ 1
Так как 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('/');
}
Ответ 2
Проверьте таблицу базы данных, если столбец "id" указан в верхнем регистре "ID". Изменение в нижний регистр позволило моему методу save() работать.
Ответ 3
У меня была та же самая проблема, и изменение способа, которым я выбираю модель, решило ее!
Не было сбережений, хотя якобы все работало так, как вы упомянули:
$user = User::find($id)->first();
Это работает:
$user = User::find($id);
Ответ 4
Попробуйте это
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('/');
}
Ответ 5
У меня было то же самое, и оказалось, потому что я фильтровал выходные столбцы без первичного ключа.
$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();
Имеет смысл при просмотре, без первичного ключа команда обновления будет установлена на нуль.
Ответ 6
По моему опыту, если вы выбираете модель 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
поскольку все столбцы будут выбраны.
Ответ 7
Я столкнулся с той же проблемой и нашел обходной путь. Я обнаружил, что мне не удалось save()
мою модель в функции с именем {{ generateUrl() }}
в моем шаблоне home.blade.php
. Что работало, так это перемещение вызова save()
к контроллеру, который return
шаблон home.blade.php
. (IE, save()
перед return
, затем выполнять только операции чтения внутри {{ 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()
его обратно. Ошибок не было. Эта функция работает нормально... пока я не попытался прочитать state
User
позже и обнаружил, что оно не соответствует state
в URL-адресе.
Вот что сработало.
Вместо того чтобы пытаться save()
моего User
во время сборки страницы, я сгенерировал state
, save()
, а затем отобразил страницу:
// routes/web.php
Route::get('/', '[email protected]');
Посадка в корневой каталог отправляет вас в функцию 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');
}
Затем при генерации 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()
модель до начала сборки страницы, а не во время сборки страницы.