यह एक अच्छा विचार मेज पर क्षेत्रों में से एक के रूप में एक रिश्ते में एक ही नाम के नाम के लिए नहीं है। क्षेत्र के उपयोग के संबंध में संबंधों तक पहुंचने का प्रयास करते समय यह समस्याएं (जैसा कि आपने पाया है) का कारण बनता है।
आदर्श रूप से, आपके 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"
}
मैं सिर्फ इतना कहना चाहता हूँ -> ('माइम') के साथ जब मैं यह लौटने रहा हूँ - कि मदद करता है? उदाहरण के लिए 'वापसी \ अपलोड :: ढूंढें (1) -> के साथ (' माइम '); ' – haakym
ऐसा कुछ कहां जाएगा? आपका मतलब है कि जब मैं किसी अन्य फ़ंक्शन में 'अपलोड' मॉडल वापस कर रहा हूं? '\ App \ Models \ upload :: findOrFail (1) -> के साथ ('माइम') 'केवल' {}' देता है जब 'JsonSerialize' को –
पर कॉल किया जाता है ठीक है अब आप इसे कैसे वापस कर रहे हैं? कृपया इसके साथ अपना प्रश्न अपडेट करें क्योंकि यह बेहतर संदर्भ दे सकता है। इसके अलावा, क्या आप JsonSerialize को कॉल करने का प्रयास नहीं कर सकते हैं, मुझे लगता है कि सभी वाद्य मॉडलों को स्वचालित रूप से JSON में परिवर्तित कर दिया जाता है, या आप एक विलुप्त मॉडल पर '-> toJson()' कर सकते हैं। – haakym