#php #laravel-4 #timestamp
#php #laravel-4 #временная метка
Вопрос:
Я только что узнал, что при обновлении модели (скажем, $post
модели), то есть при обновлении основного текста и заголовка и нажатии кнопки сохранить, автоматически обновляется столбец created_at, но я бы хотел, чтобы он обновлял ТОЛЬКО столбец updated_at.
Я довольно долго искал, прежде чем спрашивать, поэтому я знаю $post->touch()
, что обновлены только временные метки, а не остальные. И при настройке protected $timestamp = false;
в моей модели post это просто отключает обновление метки времени при обновлении / сохранении.
Для тех, кому интересно, я в настоящее время все еще использую $post->save();
для обновления сообщения.
Итак, есть ли кто-нибудь, кто знает, как сохранить created_at
(который будет установлен при создании сообщения) и обновлять updated_at
при обновлении / редактировании сообщения?
Моя функция контроллера post update():
public function update($slug)
{
$post = Post::byslug($slug);
$post->concept = Input::get('concept');
$post->title = Input::get('title');
$post->slug = Str::slug(Input::get('title'));
$post->body = Input::get('body');
$post->metatitle = 'My Website |' . Input::get('title');
$post->metadescription = Input::get('body');
$post->robots = Input::get('robots');
$post->ogtitle = 'My Website |' . Input::get('title');
$post->ogdescription = Input::get('body');
$post->ogsitename = 'My Website';
$post->ogurl = Str::slug(Input::get('title'));
$post->ogtype = Input::get('ogtype');
if(Input::hasFile('file'))
{
$file = Input::file('file');
$destinationPath = 'uploads/images/posts/';
$filename = $file->getClientOriginalName();
$upload_success = $file->move($destinationPath, $filename);
$post->image = str_replace('\', '/', $upload_success);
$post->ogimage = str_replace('\', '/', $upload_success);
}
if($post->save())
{
return Redirect::route('admin.blog.index')
->with('post', $post);
} else {
return Redirect::route('admin.blog.edit')
->with('post', $post)
->withInput();
}
}
Комментарии:
1. Что, черт возьми, позволяет вам думать, что обновление изменяет
created_at
столбец? Это, конечно, не так, поэтому покажите свой код и результаты.2. Я проверил свою базу данных, и столбец ‘created_at’ был обновлен до сегодняшней даты. Так оно и есть..
3. Как я уже сказал, покажите код, если вам нужна какая-либо помощь в решении вашей проблемы.
4. сделайте это:
if($post->save()) { return DB::getQueryLog();}
и проверьте выполненные запросы.
Ответ №1:
у меня была такая же проблема. проблема заключалась в поведении mysql при создании таблицы. я создал поле timestap следующим образом
CREATE TABLE `tablename` (
...
`created_at` TIMESTAMP NOT NULL
...
и mysql преобразовал его в поле с автоматической автообновлением (я не знаю почему, но это произошло — я проверил с помощью phpmyadmin). итак, laravel не обновлял поле — это был сам mysql.
я изменил создание поля на
... `created_at` TIMESTAMP NULL DEFAULT NULL ...
и это помогло. больше никаких «автоматически обновленных дат».
Ответ №2:
Я только что столкнулся с этим сам. Ответ Василия привел меня туда, где мне нужно было быть, но в нем отсутствовала довольно важная деталь. Параметр, который вы хотите переопределить, — это при обновлении для столбца, а не по умолчанию. Что я нашел в моем, когда я запустил
show create table <table_name>
Я нашел:
created_at timestamp NOT NULL DEFAULT current_timestamp ON UPDATE current_timestamp.
Я просто выполнил две команды alter table, одну, чтобы удалить при обновлении из созданного at, а другую, чтобы добавить его в столбец updated_at.
ALTER TABLE <table_name> CHANGE created_at created_at timestamp NOT NULL DEFAULT current_timestamp;
и
ALTER TABLE <table_name> CHANGE updated_at updated_at timestamp NOT NULL DEFAULT current_timestamp ON UPDATE current_timestamp;
Внесение этих изменений решило мою проблему, так что, как сказал Джарек, на самом деле это не проблема Laravel. Я предполагаю, что если бы вы использовали миграцию, Laravel правильно создал бы эти столбцы. (Я сам еще не использую миграции, поэтому, вероятно, я также столкнулся с проблемой.)
Ответ №3:
Небольшое обновление для @EpicWally — я не думаю, что вам нужно добавлять ОБНОВЛЕНИЕ в столбец updated_at — laravel позаботится об этом внутри.
Также — если вы хотите сделать это с помощью миграции:
public function up()
{
Schema::table('posts', function(Blueprint $table)
{
DB::statement('ALTER TABLE `posts` CHANGE `created_at` `created_at` timestamp NOT NULL DEFAULT "0000-00-00 00:00:00"');
});
}