non è una buona idea di nominare un rapporto lo stesso nome di uno dei campi sul tavolo. Ciò causa problemi (come hai scoperto) quando si tenta di accedere alla relazione rispetto all'accesso al campo.
Idealmente, il campo mime
deve essere rinominato in mime_id
. Questo è conforme alle convenzioni di Laravel ed è un nome più preciso per il campo.
Tuttavia, se non si ha la possibilità di modificare il nome del campo, è necessario modificare il nome della relazione.
class Upload extends Model {
protected $hidden = array('id', 'user', 'created_at', 'updated_at');
public function uploadMime() {
return $this->belongsTo('App\Models\Mime', 'mime');
}
}
Nella classe superiore, il nome della relazione è ora uploadMime
. Inoltre, la relazione è stata modificata da hasOne
a belongsTo
. Poiché la tabella dei caricamenti ha la chiave esterna della tabella dei mimi, il modello di caricamento appartiene al modello Mime (e il modello Mime haOne/ha molti modelli di caricamento).
Ora, il codice dovrebbe essere simile:
$data = \App\Models\Upload::with('uploadMime')->findOrFail(1);
return new JsonResponse($data);
Questo dovrebbe dare qualcosa in uscita lungo le linee di:
{
"serverPath": "upload/2015/06/06/21/filename.jpg",
"filename": "filename.jpg",
"mime": "92",
"uploadMime": {
"id": 92,
"type": "image/jpeg"
}
}
Modifica JSON utilizzando $appends
e l'attributo di accesso
Se volevi avvicinarti all'output JSON che hai fornito nella tua domanda, puoi cr EATE una funzione di accesso mimeType
e aggiungerlo alla proprietà $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');
}
}
Questo dovrebbe dare qualcosa in uscita lungo le linee di:
{
"serverPath": "upload/2015/06/06/21/filename.jpg",
"filename": "filename.jpg",
"mimeType": "image/jpeg"
}
Modifica JSON sovrascrivendo la funzione
toArray()
In alternativa, se si desidera realmente che JSON utilizzi la chiave mime
, è possibile modificare direttamente il metodo 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;
}
}
Questo dovrebbe dare qualcosa in uscita lungo le linee di:
{
"serverPath": "upload/2015/06/06/21/filename.jpg",
"filename": "filename.jpg",
"mime": "image/jpeg"
}
Vorrei solo dire -> con ('mimo') quando sto tornando esso - fa questo aiuto? Per esempio 'return \ Upload :: find (1) -> with ('mime');' – haakym
Dove andrebbe una cosa del genere? Intendi quando restituisco il modello 'Upload' in un'altra funzione? '\ App \ Models \ Upload :: findOrFail (1) -> with ('mime')' restituisce solo '{}' quando viene chiamato 'JsonSerialize' su di esso –
Bene, come lo stai restituendo ora? Si prega di aggiornare la tua domanda con questo come potrebbe dare un contesto migliore. Inoltre, potresti provare a non chiamare JsonSerialize. Penso che tutti i modelli Eloquent siano automaticamente convertiti in JSON, oppure puoi fare '-> toJson()' su un modello Eloquent. – haakym