Trik untuk Hubungan Lekas ​​Laravel

Salah satu kekuatan Laravel ialah sintaksnya yang elegan. Jika anda mempunyai banyak model dan hubungan dalam Laravel (disebabkan oleh banyak jadual dalam pangkalan data), traversing selalunya boleh berakhir dengan kod yang kurang elegan. Dari masa ke masa, tiga sambungan kecil telah terbukti berjaya untuk saya, yang ingin saya perkenalkan secara ringkas di bawah. Untuk melakukan ini, kami hanya menggunakan beberapa warisan, kaedah ajaib dan koleksi tersuai.


Mula-mula kita membuat model baru di bawah app \ ConvenienceModel.php:

b45e29b9125c2ab565b5526442437686

Kemudian kami membiarkan semua model mewarisi dari ConvenienceModel baru kami:

b45e29b9125c2ab565b5526442437686

Campurkan fungsi anda sendiri dengan hubungan

Sekiranya anda ingin mendapatkan model yang disambungkan, anda menggunakan sintaks standard untuk memanggilnya:

b45e29b9125c2ab565b5526442437686

Sekiranya sekarang anda menambah logik perniagaan anda sendiri, anda ingin menggunakan notasi casing unta (bawah):

b45e29b9125c2ab565b5526442437686

Kami mahu menyeragamkan sintaks kedua-dua varian. Untuk melakukan ini, kami menambahkan kaedah sihir __call ke ConvenienceModel:

b45e29b9125c2ab565b5526442437686

Panggilan ini juga boleh dilakukan dalam contoh di atas:

b45e29b9125c2ab565b5526442437686

Periksa objek kosong

Jika anda ingin mengeluarkan nama negara untuk alamat seseorang, anda sering melihat kod berikut:

b45e29b9125c2ab565b5526442437686

Untuk mengelakkan perkara ini, kita sertakan pustaka stringhelper dan mengembalikan objek khas kelas kosong `empty` jika model tidak ditemui.:

b45e29b9125c2ab565b5526442437686

Ini bermakna bahawa panggilan itu berjaya (dalam contoh ini, jika sesuatu ditemui, nama negara dikeluarkan, dalam semua kes lain rentetan kosong):

b45e29b9125c2ab565b5526442437686

Sekiranya kita juga ingin menutup kes bahawa pengguna dengan ID 42 mungkin tidak wujud, kita juga akan membina fungsi pembantu kecil untuk ini:

b45e29b9125c2ab565b5526442437686

Panggilan berikut memberikan rentetan kosong walaupun pengguna tidak wujud sama sekali:

b45e29b9125c2ab565b5526442437686

Melintasi hubungan n: m dengan senang

Akhirnya, kami ingin mempermudah kod berikut:

b45e29b9125c2ab565b5526442437686

Untuk ini kami menggunakan kemungkinan koleksi khusus . Kami mula-mula mengembangkan model kemudahan:

b45e29b9125c2ab565b5526442437686

Seterusnya, kita mencipta fail app\Helpers\ConvenienceCollection.php , yang memastikan bahawa apabila fungsi yang tidak diketahui dipanggil dalam Koleksi, fungsi tersebut dilaksanakan untuk semua item dalam koleksi.:

b45e29b9125c2ab565b5526442437686

Oleh itu, kita boleh menggunakan kod berikut untuk mengeluarkan semua nama semua negara dari semua alamat semua ibu bapa orang tersebut:

b45e29b9125c2ab565b5526442437686

Tetapi panggilan seperti berikut juga boleh dilakukan:

b45e29b9125c2ab565b5526442437686

Isih mengikut beberapa lajur

Arahan berikut hanya menyusun mengikut lokasi , walaupun itu mungkin bukan hasil yang dimaksudkan.:

b45e29b9125c2ab565b5526442437686

Untuk membolehkan penyortiran mengikut beberapa lajur, kami memperluas ConvenienceCollection kami:

b45e29b9125c2ab565b5526442437686

Dengan itu kita dapat menyusun koleksi mengikut beberapa lajur dengan:

b45e29b9125c2ab565b5526442437686

Pengisihan standard

Kami memperluaskan ConvenienceCollection dengan fungsi tambahan yang lain:

b45e29b9125c2ab565b5526442437686

Sekarang anda boleh memberikan setiap model fungsi penyisihan standard individu:

b45e29b9125c2ab565b5526442437686

Oleh itu, kita boleh menyusun koleksi dengan:

b45e29b9125c2ab565b5526442437686

Nama objek

Setiap model menerapkan kaedah getLabel (getName berbeza-beza bergantung pada model):

b45e29b9125c2ab565b5526442437686

Dengan ini anda dapat dengan cepat dan mudah memaparkan nama objek. Anda kemudian boleh melaksanakan kaedah pembantu sortByLabel di ConvenienceCollection:

b45e29b9125c2ab565b5526442437686

Hasil kosong

Sekiranya langkah perantaraan kosong, Laravel berfungsi pertama () dan terakhir () biasanya kembali sifar. Oleh itu, kami memperkenalkan getFirst () dan getLast () supaya panggilan berikut sentiasa berjaya:

b45e29b9125c2ab565b5526442437686

Dengan ini kami memberikan kembali __empty_helper yang dikenali __x:

b45e29b9125c2ab565b5526442437686

Belakang