Hari ini saya menghadapi masalah semasa menggunakan model thinkphp6, iaitu model tidak mengembalikan ID semasa membuat data. Ini sangat mengelirukan saya, kerana dalam pengalaman pembangunan saya sebelum ini, ID biasanya dikembalikan apabila membuat data untuk operasi seterusnya. Dalam siaran ini, saya akan berkongsi cara saya menemui punca masalah ini dan cara membetulkannya.
Mula-mula, saya menyemak kod saya untuk memastikan saya menggunakan kaedah penciptaan model dengan betul. Kod saya adalah seperti berikut:
$user = new User(); $user->name = 'John'; $user->email = 'john@example.com'; $user->save(); return $user->id;
Kod ini sepatutnya kelihatan baik kerana ia memanggil kaedah save() model, yang sepatutnya mengembalikan ID baris data yang baru dibuat. Walau bagaimanapun, apabila saya menjalankan kod, saya mendapati bahawa ID yang dikembalikan ialah 0, bukan seperti yang saya harapkan. Ini sangat mengelirukan saya kerana saya telah menggunakan kerangka thinkphp untuk masa yang lama dan saya tidak pernah mengalami masalah ini.
Seterusnya, saya melihat pada kod sumber model, terutamanya pelaksanaan kaedah save(). Saya mendapati kaedah save() model dilaksanakan dengan memanggil kaedah create() untuk mencipta baris data baharu sebelum menyimpannya:
public function save($data = [], $where = [], $sequence = null) { if ($this->isExists()) { return $this->update($data, $where, $sequence); } else { $result = $this->create($data); if ($result) { $this->sync($result); } return $result; } }
Jelas sekali apabila data dibuat, model memanggil create( ) kaedah. Kemudian, saya akan menyemak pelaksanaan kaedah create() untuk melihat sama ada ia mengembalikan ID baris data yang baru dibuat dengan betul.
public function create($data = [], $sequence = null) { if (empty($data)) { $data = $this->getOriginData(); } $result = $this->db()->insertGetId($data, $sequence); if (!empty($result)) { $this->exists(true); $this->setRawData([], true); $this->sync($result); $this->trigger('after_create'); return $result; } else { return false; } }
Dengan memerhatikan kod kaedah create() dengan teliti, saya mendapati bahawa ia sememangnya mengembalikan ID baris data yang baru dibuat. Jadi apa masalahnya?
Akhir sekali, saya melihat struktur jadual pangkalan data dan menyemak sama ada medan ID dalam jadual ditetapkan dengan betul sebagai lajur kenaikan automatik. Akibatnya, saya mendapati bahawa masalahnya terletak di sini: medan ID saya tidak ditetapkan sebagai lajur autokenaikan.
Soalan ini mengarut dan memalukan kerana alasannya sangat mudah. Walau bagaimanapun, ia juga menggambarkan hakikat bahawa kita perlu menyemak dengan teliti struktur jadual pangkalan data apabila menggunakan model untuk memastikan ia dikonfigurasikan dengan betul. Hanya dengan cara ini kita boleh menggunakan model dengan betul dan mengelakkan masalah yang tidak perlu.
Dalam kes saya, saya hanya menetapkan medan ID kepada lajur kenaikan automatik dan menjalankan semula kod saya untuk mengembalikan ID baris data yang baru dibuat dengan betul. Selepas masalah ini diselesaikan, saya menyedari bahawa nilai ID yang dikembalikan semasa membuat data adalah berdasarkan ciri lajur kenaikan automatik pangkalan data.
Dalam siaran ini, saya berkongsi pengalaman saya tentang bagaimana saya menemui masalah kecil. Punca utama masalah ini ialah struktur jadual pangkalan data tidak dikonfigurasikan dengan betul, menyebabkan model tidak mengembalikan ID semasa mencipta data. Dengan berhati-hati memeriksa kod, melihat kod sumber model, dan menyemak struktur jadual pangkalan data, saya akhirnya menyelesaikan masalah itu. Saya harap pengalaman saya dapat membantu pembangun lain lebih memahami model rangka kerja thinkphp6 supaya mereka boleh menggunakan alat berkuasa ini dengan lebih baik untuk membangunkan aplikasi web.
Atas ialah kandungan terperinci model thinkphp6 tidak mengembalikan ID. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!