Laravel คอลัมน์ที่ไม่รู้จัก 'updated_at'


160

ฉันเพิ่งเริ่มต้นกับ Laravel และฉันได้รับข้อผิดพลาดต่อไปนี้:

คอลัมน์ที่ไม่รู้จักแทรก 'updated_at' ลงใน gebruikers (naam, wachtwoord, updated_at, created_at)

ฉันรู้ว่าข้อผิดพลาดมาจากคอลัมน์เวลาประทับเมื่อคุณย้ายข้อมูลตาราง แต่ฉันไม่ได้ใช้updated_atฟิลด์ ฉันเคยใช้เมื่อฉันทำตามบทสอนของ Laravel แต่ตอนนี้ฉันกำลังทำ (หรือพยายามทำ) สิ่งของของตัวเอง ฉันได้รับข้อผิดพลาดนี้แม้ว่าฉันจะไม่ได้ใช้การประทับเวลา ฉันไม่สามารถหาสถานที่ที่ใช้งานได้ นี่คือรหัส:

ตัวควบคุม

public function created()
{
    if (!User::isValidRegister(Input::all())) {
        return Redirect::back()->withInput()->withErrors(User::$errors);
    }

    // Register the new user or whatever.
    $user = new User;
    $user->naam = Input::get('naam');
    $user->wachtwoord = Hash::make(Input::get('password'));
    $user->save();

    return Redirect::to('/users');
}

เส้นทาง

Route::get('created', 'UserController@created');

แบบ

public static $rules_register = [
    'naam' => 'unique:gebruikers,naam'
];

public static $errors;
protected $table = 'gebruikers';

public static function isValidRegister($data)
{
    $validation = Validator::make($data, static::$rules_register);

    if ($validation->passes()) {
        return true;
    }

    static::$errors = $validation->messages();

    return false;
}

ฉันต้องลืมบางสิ่งบางอย่าง ... ฉันทำอะไรผิดที่นี่


ตรวจสอบตารางของคุณหากคุณมีคอลัมน์updated_at !
Mehdi Maghrouni

@MehdiMaghrooni ฉันไม่
Loko

และนั่นคือปัญหาคุณต้องการเข้าถึงคอลัมน์ที่ไม่มีอยู่จริง คุณต้องเปลี่ยนโต๊ะเพื่อเพิ่มโต๊ะหรือแค่เอาโต๊ะนั้นออก
ยาง

@bad_boy ฉันไม่ได้ใช้อัปเดตทุกที่ในรหัสของฉัน
Loko

@bad_boy ฉันเพิ่งมีการใส่ประทับเวลาบนเท็จในรูปแบบ ...
Loko

คำตอบ:


427

ในโมเดลเขียนโค้ดด้านล่าง

public $timestamps = false;

สิ่งนี้จะได้ผล

คำอธิบาย: โดยค่าเริ่มต้น laravel จะคาดหวังคอลัมน์ create_at & updated_at ในตารางของคุณ โดยการทำให้เป็นเท็จมันจะแทนที่การตั้งค่าเริ่มต้น


7
@RameshPareek มีการระบุไว้ในเอกสาร :By default, Eloquent expects created_at and updated_at columns to exist on your tables. If you do not wish to have these columns automatically managed by Eloquent, set the $timestamps property on your model to false
Adam

เว้นแต่จะใช้เพื่อวัตถุประสงค์ในการตรวจสอบฉันไม่เห็นว่าทำไมสิ่งนี้จึงจำเป็นต้องเริ่มต้นด้วยควรจะปิดใช้งานตามค่าเริ่มต้นและเปิดใช้งานเป็นตัวเลือก
OzzyTheGiant

24

การตั้งค่าการประทับเวลาเป็นเท็จหมายความว่าคุณจะสูญเสียทั้ง created_at และ updated_at ในขณะที่คุณสามารถตั้งค่าคีย์ทั้งสองในแบบจำลองของคุณ

กรณีที่ 1:

คุณมีcreated_atคอลัมน์ แต่ไม่ update_at คุณสามารถตั้งค่าupdated_atเป็นเท็จในแบบจำลองของคุณ

class ABC extends Model {

const UPDATED_AT = null;

กรณีที่ 2:

คุณมีทั้งcreated_atและupdated_atคอลัมน์ แต่มีชื่อคอลัมน์ต่างกัน

คุณทำได้ง่ายๆ

class ABC extends Model {

const CREATED_AT = 'name_of_created_at_column';
const UPDATED_AT = 'name_of_updated_at_column';

ในที่สุดก็ละเว้นการประทับเวลาอย่างสมบูรณ์:

class ABC extends Model {

public $timestamps = false;

3
นี่ควรเป็นคำตอบที่ถูกต้อง การตั้งค่าการประทับเวลาจะลบทั้งสองฟิลด์ ขอบคุณ !!!
Sameera K

3
นี่เป็นคำตอบที่ถูกต้องเนื่องจากมีเพียงฟิลด์ updated_at ในข้อผิดพลาดที่แสดงในคำถาม
Andres Felipe

1
คำตอบนี้เป็นคำตอบที่ดีที่สุด
Mojtaba

15

คำตอบที่ดีของ Alex และ Sameer แต่อาจเป็นเพียงข้อมูลเพิ่มเติมว่าทำไมจึงจำเป็นต้องใส่

public $timestamps = false;

การประทับเวลามีการอธิบายเป็นอย่างดีในหน้า Laravelอย่างเป็นทางการ:

ตามค่าเริ่มต้น Eloquent คาดว่าจะมีคอลัมน์ created_at และ updated_at ในตาราง> ของคุณ หากคุณไม่ต้องการให้คอลัมน์เหล่านี้จัดการโดยอัตโนมัติ> Eloquent ให้ตั้งค่าคุณสมบัติ $ timestamps ในแบบจำลองของคุณเป็นเท็จ


14

สำหรับผู้ที่ใช้ laravel 5 หรือสูงกว่าจะต้องใช้โมดิฟายเออร์สาธารณะอื่น ๆ ที่ฉลาดมันจะทำให้เกิดข้อยกเว้น

Access level to App\yourModelName::$timestamps must be
public (as in class Illuminate\Database\Eloquent\Model)

public $timestamps = false;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.