import Tabs from ‘@theme/Tabs’;
import TabItem from ‘@theme/TabItem’;
İki ayrı koleksiyona ihtiyacım vardı ve bunları ilişkisel bir biçimde ilişkilendirmek istiyordum, fakat Eloquent modelleriyle çalışmıyordum. Laravel’in Collection sınıfı güçlüdür, ancak iki farklı veri kümesi arasında birden fazla ilişkiyi ifade edecek yerleşik bir yöntemi yoktur. Bu sorunu düzeltmek için laravel-collection-has-many kütüphanesini geliştirdim.
Ne Oldu?
Ne Oldu?
laravel-collection-has-many, Laravel’in Collection sınıfına hasMany() makrosu ekleyen küçük bir PHP kütüphanesidir. Bu, ilişkili bir koleksiyonu ana koleksiyona iliştirmeyi sağlar; bu işlem, Eloquent’in eager loading’ine benzer ancak düz veriler için geçerlidir. $users->hasMany($posts, 'user_id', 'id', 'posts') çağrısından sonra, koleksiyondaki her kullanıcı, eşleşen öğeleri içeren bir posts özelliği kazanır.
flowchart LR
A[Parent Collection\nusers] --> B[hasMany Macro]
C[Related Collection\nposts] --> B
B --> D[Group Related by Foreign Key\nO(n+m) single pass]
D --> E[Attach to Parent\neach user gains 'posts' property]
E --> F[Enriched Collection\nusers with nested posts]
Temel işlevsellik değişmedi: O(n+m) gruplama, tembel iç içe geçirme yerine, hem dizileri hem de nesneleri destekleme, sonuçları koleksiyon içinde otomatik olarak sarma ve tamamen özelleştirilebilir anahtar adları.
Teknoloji Yığını
Teknoloji Yığını
| Bileşen | Teknoloji | Neden |
|---|---|---|
| Dil | PHP 8.1 – 8.4 | Tüm aktif sürümler için tam matris CI |
| Framework | Laravel Collections | Mikro sistemi, tam bir framework gerektirmediği için |
| CI | GitHub Actions | Her push/PR, tüm PHP sürümlerini test eder |
| Paket formatı | Composer (Packagist uyumlu) | composer require çalışır |
| Lisans | MIT | Kullan, fork et, sat |
Ne Değişti?
Ne Değişti?
Bu güncelleme yayınlama hazır olma ile ilgilidir, yeni özelliklerle değil.
💡 İpucu: Paketten Önce Altyapıyı Göndermeyi Unutmayın
CI, lisans ve bir değişiklik günlüğü olmadan çalışan bir kütüphane, kişisel bir projedir. Üçü de olan bir kütüphane, diğer ekiplerin benimseyebileceği bir bağımlılıktır. CI matrisinizi, lisans dosyanızı ve değişiklik günlüğünü, v1.0.0’ı etiketlemeden önce yerine getirin.
⚠️ Dikkat: Lisans Yok = Benimseme Yok
Paket işlevsel olsa da, açık bir lisans yoktu, bu da herhangi bir yasal inceleme süreci olan bir organizasyonda benimsenmesini engelliyor. Eğer başkalarının kullanmasını istediğiniz bir paket oluşturuyorsanız, MIT LİSANSI, eklemeniz gereken ilk dosya olmalıdır, son değil.
php title="usage-example.php" showLineNumbers
use Illuminate\Support\Collection;
$users = collect([
['id' => 1, 'name' => 'Alice'],
['id' => 2, 'name' => 'Bob'],
]);
$posts = collect([
['user_id' => 1, 'title' => 'First Post'],
['user_id' => 1, 'title' => 'Second Post'],
['user_id' => 2, 'title' => 'Bob Writes'],
]);
// highlight-next-line
$users->hasMany($posts, 'user_id', 'id', 'posts');
// Alice şimdi $user['posts'] => 2 gönderiden oluşan Koleksiyon
// Bob şimdi $user['posts'] => 1 gönderiden oluşan Koleksiyon
yaml title=".github/workflows/test.yml" showLineNumbers
strategy:
matrix:
php-version: ['8.1', '8.2', '8.3', '8.4']
steps:
- uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php-version }}
- run: composer install
# highlight-next-line
- run: vendor/bin/phpunit
MIT LİSANSI eklendi. GitHub Actions CI, PHP 8.1, 8.2, 8.3 ve 8.4 matrisine karşı test suite'ini çalıştırıyor. Her push ve pull isteği, pipeline'ı tetikler. CHANGELOG.md, v1.0.0 girişiyle ilk kararlı sürümü belgelemektedir. Paket artık Packagist yayınlamaya hazırdır.
Yayınlama kontrol listesi
| Öğe | Durum |
|---|---|
| MIT LİSANSI | Eklendi |
| GitHub Actions CI (PHP 8.1-8.4) | Çalışıyor |
| README rozetleri (CI, PHP sürümleri, lisans) | Eklendi |
| CHANGELOG.md (v1.0.0) | Eklendi |
| Composer meta verisi + otomatik yükleme | Yapılandırıldı |
| Packagist'e hazır | Evet |
Drupal ve WordPress için Neden Önemlidir?
Drupal ve WordPress için Neden Önemlidir?
Drupal geliştiricileri genellikle özel veritabanı sorgularından, Görünümler sonuçlarından veya JSON:API yanıtlarından gelen düz dizilerle çalışmaktadırlar ve bunları Eloquent olmadan ilişkisel olarak gruplamak zorundadırlar. Bu kütüphanenin hasMany deseni, herhangi bir PHP dizi koleksiyonu üzerinde çalışarak Drupal özelleştirilmiş modüllerinde veya göç betiklerinde ebeveyn-çocuk verilerini verimli bir şekilde ilişkilendirmek için doğrudan kullanılabilir. WordPress geliştiricileri de, WP_Query dışındaki wp_posts ve wp_postmeta gibi ilişkileri birleştirirken aynı zorlukla karşı karşıya kalmaktadır -- O(n+m) gruplama yaklaşımı, özel WordPress yönetici panellerini yavaşlatan N+1 tuzağından kaçınmanıza yardımcı olur.
Teknik Çıkarım
Teknik Çıkarım
Paketinizi göndermeden önce altyapıyı gönderin. CI, lisans ve değişiklik günlüğü olmadan çalışan bir kütüphane, bir kişisel projedir. Üçü de olan bir kütüphane, diğer ekiplerin benimseyebileceği bir bağımlılıktır. Bu güncellemedeki kod, önceki sürümle aynı; değer tamamen paketlemede yatıyor. Başkalarının kullanmasını istediğiniz bir Laravel paketi geliştiriyorsanız, CI matrisini, lisans dosyasını ve değişiklik günlüğünü, v1.0.0'ı etiketlemeden önce yerine koyun. Maliyeti bir öğleden sonradır. Karşılığında ilk genel sürümünüz, başından itibaren güvenilir olur.
Referanslar
Referanslar
Sadece kod yazan değil, ekibinizin çıktısını katlayan AI sistemleri inşa eden bir Mimara mı ihtiyaç duyuyorsunuz? Kurumsal CMS vaka çalışmalarımı görmek için victorjimenezdev.github.io adresine göz atın veya LinkedIn üzerinden benimle bağlantı kurun.
İlk yayım tarihi VictorStack AI — Drupal & WordPress Referansı olarak yayımlanmıştır.
Kaynak: Orijinal Makale


