2015-06-06 15 views
14

का उपयोग कर मैं एक मॉडल के रूप में सेटअप इतना है json जवाब में मॉडल रिश्तों को शामिल करें:सुवक्ता और Laravel 5

<?php namespace App\Models; 

use Illuminate\Database\Eloquent\Model; 

class Upload extends Model { 

    /** 
    * The database table used by the model. 
    * 
    * @var string 
    */ 
    protected $table = 'uploads'; 

    /** 
    * The attributes excluded from the model's JSON form. 
    * 
    * @var array 
    */ 
    protected $hidden = array('id', 'user', 'created_at', 'updated_at'); 

    public function mime() { 
     return $this->hasOne('App\Models\Mime', 'mime'); 
    } 
} 

और जब JsonSerialize() कहा जाता है, यह रिटर्न:

{ 
    "serverPath": "upload/2015/06/06/21/filename.jpg", 
    "filename": "filename.jpg", 
    "mime": "92" 
} 

यह 92 संदर्भ आईडी एक और तालिका में (जो App\Models\Mime का प्रतिनिधित्व करता है) एक स्ट्रिंग के साथ, type, इसके साथ जुड़ा हुआ है। मैं कहा गया स्ट्रिंग के साथ इस 92 को प्रतिस्थापित करना चाहता हूं।

{ 
    "serverPath": "upload/2015/06/06/21/filename.jpg", 
    "filename": "filename.jpg", 
    "mime": "image/jpeg" 
} 

यह कैसे संभव है? मैंने Upload मॉडल में protected $appends के साथ कुछ सामानों की कोशिश की, लेकिन मुझे यकीन नहीं है कि मैं पूरी तरह समझता हूं कि मॉडल के भीतर संबंधों का उपयोग/उपयोग कैसे किया जाए।

स्पष्टीकरण तालिका mimes कॉलम id और type शामिल, टेबल अपलोड एक पूर्णांक स्तंभ mime कहा जाता है एक आईडी का संदर्भ देता है mimes में शामिल करते हुए

+1

मैं सिर्फ इतना कहना चाहता हूँ -> ('माइम') के साथ जब मैं यह लौटने रहा हूँ - कि मदद करता है? उदाहरण के लिए 'वापसी \ अपलोड :: ढूंढें (1) -> के साथ (' माइम '); ' – haakym

+0

ऐसा कुछ कहां जाएगा? आपका मतलब है कि जब मैं किसी अन्य फ़ंक्शन में 'अपलोड' मॉडल वापस कर रहा हूं? '\ App \ Models \ upload :: findOrFail (1) -> के साथ ('माइम') 'केवल' {}' देता है जब 'JsonSerialize' को –

+0

पर कॉल किया जाता है ठीक है अब आप इसे कैसे वापस कर रहे हैं? कृपया इसके साथ अपना प्रश्न अपडेट करें क्योंकि यह बेहतर संदर्भ दे सकता है। इसके अलावा, क्या आप JsonSerialize को कॉल करने का प्रयास नहीं कर सकते हैं, मुझे लगता है कि सभी वाद्य मॉडलों को स्वचालित रूप से JSON में परिवर्तित कर दिया जाता है, या आप एक विलुप्त मॉडल पर '-> toJson()' कर सकते हैं। – haakym

उत्तर

26

यह एक अच्छा विचार मेज पर क्षेत्रों में से एक के रूप में एक रिश्ते में एक ही नाम के नाम के लिए नहीं है। क्षेत्र के उपयोग के संबंध में संबंधों तक पहुंचने का प्रयास करते समय यह समस्याएं (जैसा कि आपने पाया है) का कारण बनता है।

आदर्श रूप से, आपके mime फ़ील्ड का नाम बदलकर mime_id कर दिया जाना चाहिए। यह लैरावेल के सम्मेलनों के अनुरूप है, और यह क्षेत्र के लिए एक और सटीक नाम है।

हालांकि, यदि आपके पास फ़ील्ड का नाम बदलने की क्षमता नहीं है, तो आपको रिश्ते का नाम बदलना चाहिए।

class Upload extends Model { 
    protected $hidden = array('id', 'user', 'created_at', 'updated_at'); 

    public function uploadMime() { 
     return $this->belongsTo('App\Models\Mime', 'mime'); 
    } 
} 

ऊपर कक्षा में, रिश्ते नाम अब uploadMime है। इसके अतिरिक्त, संबंध hasOne से belongsTo में बदल दिया गया था। चूंकि आपकी अपलोड तालिका में माइम्स टेबल की विदेशी कुंजी है, इसलिए अपलोड मॉडल माइम मॉडल से संबंधित है (और माइम मॉडल के पास है/कई अपलोड मॉडल हैं)।

$data = \App\Models\Upload::with('uploadMime')->findOrFail(1); 
return new JsonResponse($data); 

यह आपको की तर्ज पर उत्पादन कुछ देना चाहिए::

अब, अपने कोड कुछ ऐसा दिखाई देगा

{ 
    "serverPath": "upload/2015/06/06/21/filename.jpg", 
    "filename": "filename.jpg", 
    "mime": "92", 
    "uploadMime": { 
     "id": 92, 
     "type": "image/jpeg" 
    } 
} 

संशोधित JSON $appends और विशेषता का उपयोग पहुंचकर्ता

यदि आप जेएसओएन आउटपुट के करीब जाना चाहते हैं तो आपने अपने प्रश्न में प्रदान किया है, तो आप क्रैन कर सकते हैं एक mimeType एक्सेसर eate और $appends संपत्ति में जोड़ें:

class Upload extends Model { 
    // hide the mime field and uploadMime data 
    protected $hidden = array('id', 'user', 'created_at', 'updated_at', 'mime', 'uploadMime'); 

    // add the mimeType attribute to the array 
    protected $appends = array('mimeType'); 

    // code for $this->mimeType attribute 
    public function getMimeTypeAttribute($value) { 
     $mimeType = null; 
     if ($this->uploadMime) { 
      $mimeType = $this->uploadMime->type; 
     } 
     return $mimeType; 
    } 

    public function uploadMime() { 
     return $this->belongsTo('App\Models\Mime', 'mime'); 
    } 
} 

यह आपको की तर्ज पर उत्पादन कुछ देना चाहिए: toArray() समारोह

अधिभावी द्वारा

{ 
    "serverPath": "upload/2015/06/06/21/filename.jpg", 
    "filename": "filename.jpg", 
    "mimeType": "image/jpeg" 
} 

संशोधित JSON या, यदि आप वास्तव में JSON को mime कुंजी का उपयोग करना चाहते हैं, तो आप सीधे toArray() विधि को संशोधित कर सकते हैं:

class Upload extends Model { 
    // hide uploadMime data, but not the mime field 
    protected $hidden = array('id', 'user', 'created_at', 'updated_at', 'uploadMime'); 

    public function uploadMime() { 
     return $this->belongsTo('App\Models\Mime', 'mime'); 
    } 

    // override the toArray function (called by toJson) 
    public function toArray() { 
     // get the original array to be displayed 
     $data = parent::toArray(); 

     // change the value of the 'mime' key 
     if ($this->uploadMime) { 
      $data['mime'] = $this->uploadMime->type; 
     } else { 
      $data['mime'] = null; 
     } 

     return $data; 
    } 
} 

यह आपको उत्पादन कुछ की तर्ज पर देना चाहिए:

{ 
    "serverPath": "upload/2015/06/06/21/filename.jpg", 
    "filename": "filename.jpg", 
    "mime": "image/jpeg" 
} 
+0

यह सही है! बहुत बहुत धन्यवाद। –

+0

यह 5.2 में लागू है? – user3779015

+0

@ user3779015 हां, यहां दी गई जानकारी अभी भी 5.2 के लिए प्रासंगिक है। – patricus

0

ठीक है मेरा मानना ​​है कि यह आप क्या कर रहे हैं है के लिए ...

Upload.php देख (कोई बदलाव नहीं यहाँ)

<?php namespace App\Models; 

use Illuminate\Database\Eloquent\Model; 

class Upload extends Model { 

    /** 
    * The database table used by the model. 
    * 
    * @var string 
    */ 
    protected $table = 'uploads'; 

    /** 
    * The attributes excluded from the model's JSON form. 
    * 
    * @var array 
    */ 
    protected $hidden = array('id', 'user', 'created_at', 'updated_at'); 

    public function mime() { 
     return $this->hasOne('App\Models\Mime', 'mime'); 
    } 
} 

तो फिर आप अपने माइम मॉडल

Mime.php है

<?php namespace App\Models; 

use Illuminate\Database\Eloquent\Model; 

class Mime extends Model { 

    /** 
    * The database table used by the model. 
    * 
    * @var string 
    */ 
    protected $table = 'mimes'; 

} 

आप एक परीक्षण मेरा मानना ​​है कि आप प्रकार

routes.php देखना चाहिए के लिए ऐसा करता है, तो

Route::get('test', function() { 
    $upload = \Upload::with('mime')->first(); 
    // return $upload //here would return it as JSON I'm pretty sure! 
    return $upload->mime->type; 
}); 

उत्सुक लोड हो रहा है पर अधिक जानकारी के लिए चेक डॉक्स: http://laravel.com/docs/5.0/eloquent#eager-loading

+0

यह त्रुटि लौटा रहा है: ConeryException Connection.php लाइन 624: SQLSTATE [42S22]: कॉलम नहीं मिला: 1054 अज्ञात कॉलम 'mimes.mime' 'जहां खंड' (एसक्यूएल: 'mimes' से चुनें * जहां 'mimes'.mime' में (826))। यदि यह मदद करता है, तो तालिका 'माइम्स' में कॉलम 'आईडी' और 'टाइप' होता है, जबकि' अपलोड्स 'में' माइम 'नामक एक पूर्णांक कॉलम होता है जो' mimes' –

+0

में 'id' का संदर्भ देता है। -> हैऑन ('ऐप \ मॉडल \ माइम', 'आईडी', 'माइम'); 'जो एसक्यूएल त्रुटि को ठीक करता है। हालांकि अब मुद्दा यह है कि '$ अपलोड-> माइम' एक वस्तु नहीं है, लेकिन सिर्फ आईडी है। –

+1

@partricus उत्तर देखें, यह वही है जो मैं अपना उत्तर भी अपडेट करूँगा अगर वह पहले से ही इसे पोस्ट नहीं किया गया था – haakym

संबंधित मुद्दे