Fasih: find() dan Where() menggunakan laravel

Saya mencoba mendapatkan catatan dari tabel database posts menggunakan idnya. Saya sudah lama memikirkan metode find(), bingung mengapa metode itu tidak berhasil. Inilah pertanyaan saya yang terlihat benar bagi saya tetapi tidak berhasil:

$post = Post::find($id);
$post->delete();

Dengan enggan saya melakukan ini:

$post = Post::where('id', $id);
$post->delete();

dan yang cukup mengejutkan, itu berhasil tetapi saya tidak tahu caranya.

Saya juga tahu bahwa tidak seperti find(), where() adalah pembuat kueri sehingga saya juga bisa menggunakannya seperti ini: Post::where('id', $id)->first()

Adakah gagasan tentang perbedaan cara kerja metode ini?


person Awa Melvine    schedule 21.11.2016    source sumber


Jawaban (3)


Kode Anda terlihat baik-baik saja, tetapi ada beberapa hal yang perlu diperhatikan:

Post::find($id); bertindak berdasarkan kunci utama, jika Anda telah menyetel kunci utama dalam model Anda ke selain id dengan melakukan:

protected  $primaryKey = 'slug';

maka find akan mencari berdasarkan kunci itu.

Laravel juga mengharapkan id menjadi bilangan bulat, jika Anda menggunakan sesuatu selain bilangan bulat (seperti string), Anda perlu menyetel properti penambahan pada model Anda ke false:

public $incrementing = false;
person craig_h    schedule 22.11.2016
comment
Ada perbedaan besar dalam pelaksanaan proses penghapusan. Jika Anda menggunakan instance model untuk menghapus yaitu $post-›delete(), dua kueri akan dijalankan. Satu untuk mengambil record dari database menggunakan metode find() dan yang kedua untuk menghapus record. Saat menggunakan pembuat kueri, hanya satu kueri yang dijalankan, instance model tidak pernah dibuat. Akibatnya fitur apa pun pada model Post tidak akan berfungsi. Misalnya jika Anda memiliki pendengar acara penghapusan model, itu tidak akan dieksekusi. - person Ahmed Shefeer; 24.07.2018
comment
Jawaban Ahmed harus ditonjolkan, karena perbedaannya dapat menyebabkan banyak kebingungan. - person Mathieu Bour; 15.05.2019

Untuk menambahkan komentar craig_h di atas (saat ini saya tidak memiliki cukup perwakilan untuk menambahkan ini sebagai komentar pada jawabannya, maaf), jika kunci utama Anda bukan bilangan bulat, Anda juga ingin memberi tahu model Anda jenis data apa itu adalah dengan mengatur keyType di bagian atas definisi model.

public $keyType = 'string'

Eloquent memahami salah satu tipe yang didefinisikan dalam fungsi castAttribute(), yang pada Laravel 5.4 adalah: int, float, string, bool, object, array, collection, date dan timestamp.

Ini akan memastikan bahwa kunci utama Anda dimasukkan dengan benar ke dalam tipe data PHP yang setara.

person SlyDave    schedule 20.07.2017

Tidak Ditemukan Pengecualian

Terkadang Anda mungkin ingin memberikan pengecualian jika model tidak ditemukan. Hal ini sangat berguna dalam rute atau pengontrol. Metode findOrFail dan firstOrFail akan mengambil hasil kueri pertama. Namun, jika tidak ada hasil yang ditemukan, Illuminate\Database\Eloquent\ModelNotFoundException akan dilempar:

$model = App\Flight::findOrFail(1);

$model = App\Flight::where('legs', '>', 100)->firstOrFail();

Jika pengecualian tidak tertangkap, respons HTTP 404 secara otomatis dikirim kembali ke pengguna. Tidak perlu menulis pemeriksaan eksplisit untuk mengembalikan respons 404 saat menggunakan metode berikut:

Route::get('/api/flights/{id}', function ($id) {
    return App\Flight::findOrFail($id);
});
person Miqayel    schedule 08.12.2019