Trik untuk Hubungan Lekas ​​Laravel

Salah satu kelebihan Laravel adalah sintaksnya yang elegan. Sekiranya anda mempunyai banyak model dan hubungan di Laravel (kerana banyak jadual dalam pangkalan data), melintasi sering kali boleh berakhir dengan kod yang kurang elegan. Dalam jangka masa, tiga sambungan kecil membuktikan diri saya, yang ingin saya perkenalkan secara ringkas di bawah. Kami hanya menggunakan beberapa harta pusaka, kaedah sihir dan koleksi khusus.


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

Oleh itu, panggilan ini juga boleh dilakukan dalam contoh di atas:

b45e29b9125c2ab565b5526442437686

Periksa objek kosong

Sekiranya anda ingin mengeluarkan nama negara ke alamat seseorang, anda akan sering melihat kod berikut:

b45e29b9125c2ab565b5526442437686

Untuk mengelakkan ini, kami memasukkan pustaka stringhelper dan mengembalikan objek khas kelas kosong kosong jika model tidak dijumpai:

b45e29b9125c2ab565b5526442437686

Ini juga menjadikan panggilan berjaya (dalam contoh ini, jika ada sesuatu yang dijumpai, nama negara adalah output, 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

Kemudian kami membuat aplikasi file \ Helpers \ ConvenienceCollection.php , yang memastikan bahawa memanggil fungsi yang tidak diketahui dalam koleksi melaksanakan fungsi 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

Panggilan berikut hanya mengikut lokasi , walaupun itu bukan yang anda mahukan:

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