php - metodos - response status laravel
Incluir relaciones de modelo en la respuesta json usando Eloquent y Laravel 5 (2)
Tengo una configuración de modelo como tal:
<?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'');
}
}
Y cuando se llama a JsonSerialize()
, devuelve:
{
"serverPath": "upload/2015/06/06/21/filename.jpg",
"filename": "filename.jpg",
"mime": "92"
}
Este 92
referencia al ID en otra tabla (que representa App/Models/Mime
) con una cadena, type
, asociada con él. Me gustaría reemplazar este 92
con dicha cadena.
{
"serverPath": "upload/2015/06/06/21/filename.jpg",
"filename": "filename.jpg",
"mime": "image/jpeg"
}
¿Cómo es esto posible? Intenté algunas cosas con protected $appends
en el modelo Upload
, pero no estoy seguro de entender completamente cómo usar / acceder a las relaciones desde el modelo.
Aclaración La tabla mimes contiene las columnas id
y type
, mientras que las cargas de la tabla contienen una columna entera llamada mime
que hace referencia a una id en mimes
Bien, creo que esto es lo que estás buscando ...
Upload.php (no hay cambios aquí)
<?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'');
}
}
Entonces tienes tu modelo 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'';
}
Si haces esto para una prueba, creo que deberías ver el tipo
rutas.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;
});
Revise los documentos para obtener más detalles sobre la carga impaciente: http://laravel.com/docs/5.0/eloquent#eager-loading
No es una buena idea nombrar a una relación con el mismo nombre que uno de los campos en la tabla. Esto causa problemas (como ha descubierto) al intentar acceder a la relación en lugar de acceder al campo.
Idealmente, tu campo mime
debería ser renombrado a mime_id
. Esto se ajusta a las convenciones de Laravel y es un nombre más preciso para el campo.
Sin embargo, si no tiene la capacidad de cambiar el nombre del campo, debe cambiar el nombre de la relación.
class Upload extends Model {
protected $hidden = array(''id'', ''user'', ''created_at'', ''updated_at'');
public function uploadMime() {
return $this->belongsTo(''App/Models/Mime'', ''mime'');
}
}
En la clase anterior, el nombre de la relación ahora es uploadMime
. Además, la relación se cambió de hasOne
a belongsTo
. Como la tabla de cargas tiene la clave externa de la tabla de mimos, el modelo de carga pertenece al modelo de Mime (y el modelo de Mime tiene uno / hasMuchos modelos de carga).
Ahora, su código debe verse algo como:
$data = /App/Models/Upload::with(''uploadMime'')->findOrFail(1);
return new JsonResponse($data);
Esto debería darle salida a algo como las líneas de:
{
"serverPath": "upload/2015/06/06/21/filename.jpg",
"filename": "filename.jpg",
"mime": "92",
"uploadMime": {
"id": 92,
"type": "image/jpeg"
}
}
Modificando JSON usando $appends
y atributos de acceso
Si desea acercarse a la salida JSON que ha proporcionado en su pregunta, puede crear un acceso mimeType
y agregarlo a la propiedad $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'');
}
}
Esto debería darle salida a algo como las líneas de:
{
"serverPath": "upload/2015/06/06/21/filename.jpg",
"filename": "filename.jpg",
"mimeType": "image/jpeg"
}
Modificar JSON anulando la función toArray()
O, si realmente quieres que JSON use la clave mime
, puedes modificar el método toArray()
directamente:
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;
}
}
Esto debería darle salida a algo como las líneas de:
{
"serverPath": "upload/2015/06/06/21/filename.jpg",
"filename": "filename.jpg",
"mime": "image/jpeg"
}