laravel 5.でクエリビルダーを使用して更新の問題を取得します。5. updated_atを無効にしようとしましたが、失敗し続けます。
これが私のコードです:
$query = StockLog::where('stock_id', $id)->whereBetween('created_at', $from, $to])->update(['batch_id' => $max + 1]);
私は2つの方法を試しました:私が設定したモデルで最初のもの:
public function setUpdatedAtAttribute($value)
{
/*do nothing*/
}
二つ目:
$stocklog = new StockLog;
$stocklog->timestamps = false;
$query = $stocklog::where('stock_id', $id)->whereBetween('created_at', [$from, $to])->update([
'batch_id' => $max + 1]);
どちらも失敗しています。とにかくupdated_atを無効にする方法はありますか?
前もって感謝します
デフォルトでは、Eloquentはデータベーステーブルのcreated_at列とupdated_at列を自動的に維持します。これらのタイムスタンプ列をテーブルに追加するだけで、Eloquentが残りを処理します。
それらを削除することはあまりお勧めしません。ただし、次の方法を使用する場合。
以下をmodelに追加します。
public $timestamps = false;
これにより、タイムスタンプが無効になります。
[〜#〜] edit [〜#〜]:created_at
フィールドを保持したいようですが、モデルのgetUpdatedAtColumn
をオーバーライドできます。
次のコードを使用します。
public function getUpdatedAtColumn() {
return null;
}
モデルに次のメソッドを追加します。
/**
* @param mixed $value
* @return $this
*/
public function setUpdatedAt($value)
{
return $this;
}
更新:Laravel 5.5:
これをモデルで使用してみてください:
const CREATED_AT = null;
const UPDATED_AT = null;
受け入れられた答えは私にとってはうまくいきませんでしたが、この解決策を正しい方向に導いてくれました:
class Whatever extends Model {
//...
const UPDATED_AT=NULL;
//...
Laravel 5.
永久にオフにしたい場合は、以下を使用できます。
以下をモデルに追加してください...
public $timestamps = false;
そして、created_atを使い続けたい場合は、以下を追加します。
static::creating( function ($model) {
$model->setCreatedAt($model->freshTimestamp());
});
または次のように使用します...
/**
* Set the value of the "updated at" attribute.
*
* @param mixed $value
* @return void
*/
public function setUpdatedAt($value)
{
$this->{static::UPDATED_AT} = $value;
}
この場合、Eloquentの代わりにQuery Builderを使用することをお勧めしますQuery Builderはタイムスタンプフィールドを暗黙的に編集しないためです。 Query Builderを使用すると、すべてのモデルを変更せずに、関連する更新操作のみを対象とするという利点があります。
1行で次のことができます。
$query = \DB::table('stocklogs')->where('stock_id', $id)->whereBetween('created_at', [$from, $to])->update(['batch_id' => $max + 1]);