Artikel ini menyusun dan berkongsi enam petua Laravel Eloquent yang boleh meningkatkan kebolehbacaan kod saya harap ia akan membantu semua orang.
Eloquent ialah ORM yang digunakan oleh Laravel secara lalai. Mod rakaman aktif digunakan. Membolehkan anda berinteraksi dengan pangkalan data dengan cara yang lebih mudah. Setiap model individu mewakili jadual dalam pangkalan data yang boleh anda kendalikan. Dalam artikel ini, kami akan menunjukkan kepada anda lebih kurang rahsia, kaedah dan sifat tersembunyi yang mungkin anda tidak tahu untuk menambah baik kod anda.
Atribut penamaan ular ialah atribut yang menarik. Mari lihat apa yang dinyatakan oleh kod itu:
/** * 指示是否在数组上使用蛇形大小写属性。 * * @var bool */ public static $snakeAttributes = true;
Orang sering menggunakan harta ini secara tidak betul untuk menukar cara harta itu diakses. Ramai orang percaya bahawa jika anda menukar harta ini, anda boleh mengakses harta itu dengan mudah menggunakan anotasi camelCase. Ini tidak berlaku. Kami amat mengesyorkan anda untuk tidak menggunakannya. Apabila model dikeluarkan sebagai tatasusunan, hanya tentukan sama ada atribut haruslah camelCase atau SnakeCase.
Jika anda ingin mengasaskan penamaan camelCase, kami mengesyorkan anda menyemak pakej Eloquence oleh Kirk Bushell.
Jika anda Jika anda gunakan ORM Eloquent Laravel, maka ini berita baik untuk anda. Ia menyediakan kaedah penomboran di luar kotak. Anda mungkin biasa menulis seperti ini:
$comments = Comment::paginate(20);
Menggunakan kaedah ini, anda boleh menomborkan model ulasan dengan 20 entri setiap halaman. Tukar nilai ini untuk menentukan bilangan item yang dipaparkan setiap halaman. Jika tiada apa yang dinyatakan, nilai lalai digunakan, iaitu 15.
Andaikan anda mahu ulasan anda dipaparkan di berbilang tempat di tapak web anda. Selalu ada 30 komen setiap halaman. Jika anda perlu melepasi parameter 30 di mana-mana, itu masalah. Oleh itu, anda boleh menetapkan nilai lalai baharu secara langsung pada model.
protected $perPage = 30;
Eloquent mempunyai ciri berkuasa yang dipanggil "accessor". Ciri ini membolehkan anda menambah medan tersuai pada model atau jadual yang tidak wujud dalam model. Tidak kira jika anda menggunakan nilai sedia ada atau mentakrifkan nilai baharu sepenuhnya, anda sentiasa boleh berundur. Di bawah ialah contoh cara pengakses berfungsi. Katakan terdapat model bernama user
, kami menambah pengakses Nama Penuh padanya:
function getFullNameAttribute() { return sprintf('%s %s', $this->first_name, $this->last_name); }
Kini anda boleh mengakses atribut full_name
pada model siaran, seperti berikut:
User::latest()->first()->full_name;
Jika objek (seperti koleksi) dikembalikan, sifat ini tidak akan dilampirkan pada model pengguna. Tambahkan atribut$appends
yang dilindungi pada model. Ia menerima tatasusunan yang mengandungi satu atau lebih medan, yang harus dilampirkan secara automatik mulai sekarang. Tulis sahaja seperti ini:
protected $appends = ['full_name'];
Mutator adalah bertentangan dengan getter. Anda boleh melakukan perkara yang sangat menarik dengannya. Sebagai contoh, tukar jenis input yang berbeza. Biar saya beritahu anda secara terperinci. Katakan anda ingin menyimpan jenis tempoh masa. Secara amnya, anda sentiasa menyimpan unit terkecil yang mungkin. Dalam kes kami, ia adalah beberapa saat. Atas sebab UX, pengguna tidak mahu memasukkan saat, seperti minit di satu tempat atau jam di tempat lain. Ini semua boleh diselesaikan dengan cepat.
class Video extends Model { public function setDurationInMinutes($value) { $this->attributes['duration_in_seconds'] = $value * 60; } public function setDurationInHours($value) { $this->attributes['duration_in_seconds'] = $value * 60 * 60; } }
Kod di atas bermakna anda boleh menggunakan medan yang tidak wujud dalam jadual data itu sendiri. Medan
digunakan dalam duration_in_minutes
model, tetapi di latar belakang, kami menggunakan duration_in_seconds
untuk mengemas kini, atau mungkin menggunakan medan yang tidak wujud duration_in_hours
. Mengikut logik ini, kami memanggilnya seperti ini dalam Pengawal:
class AnyController { public function store() { $video->update([ 'title' => request('title'), 'duration_in_minutes' => request('duration_in_minutes'), ]); } }
Ini akan menjimatkan masa anda melakukan pengiraan dalam pengawal, anda hanya boleh menggunakan lajur yang tidak wujud dan menggunakannya semasa melakukan pengiraan tertentu 变异器
Petakan hasilnya ke medan yang betul.
Mari kita bercakap tentang perhubungan. Secara lalai, Laravel menggunakan pemuatan malas. Apakah maksud ini dari segi perhubungan? Kelebihan lazy loading ialah ia dapat menjimatkan memori, kerana tidak semua data perlu disimpan, dan kita boleh memuatkan data apabila diperlukan. Seperti berikut:
$comments = Comment::all(); foreach ($comments as $comment) { echo $comment->user->name; }
Dalam contoh di atas, kami akan mendapat semua data ulasan. Kemudian lelaran melalui ulasan dan memaparkan nama pengguna untuk setiap ulasan. Tidak ada yang salah dengan kod ini dan ia berfungsi dengan baik, tetapi kami menghadapi masalah. Pemuatan malas kini memastikan bahawa pertanyaan untuk mendapatkan pengguna hanya dilaksanakan apabila kami ingin mengeluarkan nama pengguna.
Selamat datang ke soalan N 1 pertama anda. Kenapa N 1? N ialah bilangan ulasan dan 1 ialah pertanyaan untuk mendapatkan ulasan. Contohnya, jika kami mempunyai 500 ulasan, maka pertanyaan untuk mendapatkan semua ulasan dicetuskan sekali, dan kemudian satu pertanyaan untuk mendapatkan pengguna setiap ulasan yang sepadan. Jadi 500 untuk 1 pertanyaan. Ini bermakna apabila bilangan anotasi bertambah, bilangan pertanyaan juga meningkat.
Untuk mengelakkan ini, terdapat kaedah yang dipanggil eager loading.
$comments = Comment::with('user')->get(); foreach ($comments as $comment) { echo $comment->user->name; }
这会以两个查询结束。第一个查询获取所有注释,第二个查询立即获取所有关联用户。在后台,会发生以下情况(简化版SQL):
SELECT id, user_id, body FROM comments; SELECT name FROM users WHERE user_id IN (1,2,3,4,5...);
不论是 10、500 还是 10000 条评论数据都不重要,我们都依旧只执行两次SQL查询。
好了,你现在已经看到如何使用渴求式加载了。但只限于如何手动使用。你还可以将整个过程自动化,以便某些关联关系总是自动通过渴求式方式加载。为此,需要给模型设定一个属性。
protected $with = [];
我们可以在Comment
model简单设置 protected $with = ['user'];
, 从现在起,user
在任何时候都会自动加载。
我们还有很多种渴求式加载,有仅加载特定列、嵌套即时加载、多个即时加载等等。更多详情请Laravel文档或深入核心。
有的时候需要查询所有的主键 ID, 查询是否复杂并不重要,大多数人可能会像这样做:
User::all()->pluck('id');
这个操作很 nice,但是返回的是一个集合,想要转换成数组的话可以使用 toArray()
。
User::all()->pluck('id')->toArray();
大多数情况下,上面的操作的可以简化成这样:
User::all()->modelKeys();
这种方式返回一个数组。重要的是这个方法并不会总是返回 id
。 顾名思义,他是以数组的形式返回所有模型主键。主键默认是id
,同时也可以在模型中定义主键名。
protected $primaryKey = 'id';
原文地址:https://laravel-news.com/6-eloquent-secrets
译文地址:https://www.php.cn/link/c7decb5ce28209911b545d0b1059c5e3
【相关推荐:laravel视频教程】
Atas ialah kandungan terperinci 6 Petua Laravel Fasih untuk membantu anda meningkatkan kebolehbacaan kod!. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!