modelos metodos metodo espaƱol ejemplos ejemplo all php laravel eloquent laravel-5

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" }