2016-06-16 27 views
5

Açıklayıcı olmayan başlık için özür dilerim ama açıklayıcı bir modelle gelemedim.Laravel: JSON ve pivot tablo

aşağıdaki 3 tablolar var: - oyunlar - platformlar - games_platforms

Ve Platformu ve Oyun ikisi için laravel 2 Modeller var.

public function games() 
{ 
    return $this->belongsToMany('App\Game', 'games_platforms')->withPivot('release_date'); 
} 

public function platforms() 
{ 
    return $this->belongsToMany('App\Platform', 'games_platforms')->withPivot('release_date'); 
} 

Şimdi bu böyle, 3 tablolarda tüm bilgileri içeren bir JSON dizesi olsun, bir cazibe gibi çalışır.

[{ 
    "id": 1, 
    "name": "Borderlands", 
    "short_description": "", 
    "created_at": null, 
    "updated_at": null, 
    "platforms": [{ 
     "id": 4, 
     "name": "PC", 
     "pivot": { 
      "game_id": 1, 
      "platform_id": 4, 
      "release_date": "2016-03-03" 
     } 
    }] 
}] 

Artık benim sorunum şu şekildedir.

"platforms": [{ 
     "id": 4, 
     "name": "PC", 
     "release_date": "2016-03-03" 

böyle bir şey yapmak için laravel kolay bir yolu var mı: Böyle bütün 'Pivot' bilgisini, sadece 'RELEASE_DATE', göstermek istemiyor musunuz? Şu anda görebildiğim kadarıyla, diğer yazılara bakmak, jsonu bir diziye çeviren bir fonksiyon yazmak ve bunu ayarlayabilirim. Ya da Laravel'in hepsini yapmasına izin vermek yerine kendi sorgemi yazabilirim.

Bu konuda bana yardımcı olabileceğinizi umarız. Teşekkürler!

+0

Biliyorum Laravel, çok anlaşılabilir sözdizimi ile kutunun dışında istekli yükleme destekler. Pivot masalarda hiç kullanmadım ama belki denemelisin? Birisi burada yaptı ve cevap yardımcı görünüyordu: https://laracasts.com/discuss/channels/eloquent/eager-loading-pivot-tables Ayrıca bu önceki soru çok iyi bir cevabı var gibi görünüyor: http: // stackoverflow. com/questions/21645257/generating-clean-formatted-json-with-laravel-pivot-tabloları? rq = 1 – Loek

cevap

4

isterim toplama sınıfı yöntemlerle sorgudan döndürülen verileri değiştirmek: Bu zaten cevap olduğunu

//replace Game::all() with your actual query 
return Game::all()->each(function($game){ 
    $game->platforms->map(function($platform){ 
     $platform->release_date = $platform->pivot->release_date; 
     unset($platform->pivot); 
     return $platform; 
    }); 
}); 
+0

Parlak, aradığım şey budur. Teşekkür ederim. – Serellyn

+0

@Serellyn, yardımcı olabileceğime sevindim – Steve

0

ama doğru cevap size gizlemek istediğini eklemek olacağına inanıyorum senin modelde gizli özellik.

<?php 
class Games extends Eloquent 
{ 
    protected $hidden = ['pivot.game_id', 'pivot.platform_id']; 
} 

İki örneğinizde anahtarlarınızın ne olduğundan farklı olduğundan emin değilim. Lütfen bkz .: https://github.com/laravel/framework/issues/745