laravel - tablas - Usar accesos con campos de tabla dinámica en Eloquent
orm de laravel (5)
No he probado, pero esto debería funcionar.
public function getSystemAttribute($value)
{
return $this->pivot->system . '' Testing'';
}
...
foreach ($user->games as $game)
{
echo $game->system;
}
El valor que se transfiere se extrae de los atributos de los modelos. No hay ningún atributo del sistema, por lo que debe obtener NULL. Podemos ignorar eso y extraer el valor de la tabla dinámica directamente.
Actualmente tengo algunos modelos que tienen muchas relaciones a través de laravel. aquí está la estructura:
users
id
username
...
games
id
title
...
game_user
game_id
user_id
system
Ahora, mis modelos se ven un poco así:
<?php
class Game extends Eloquent
{
/**
* A game is owned by many users
*
* @return mixed
*/
public function user()
{
return $this->belongsToMany(''User'')->withPivot(''system'');
}
<?php
class User extends Eloquent
{
/**
* A user has many games.
*
* @return mixed
*/
public function games()
{
return $this->belongsToMany(''Game'')->withPivot(''system'');
}
Ahora, todo esto funciona bien. Sin embargo, deseo usar un mutador en el campo del sistema desde la tabla dinámica. No puedo encontrar ninguna documentación sobre esto y lo siguiente (en los modelos Usuario y Juego) no funciona:
public function getSystemAttribute($val)
{
return $val.'' Testing'';
}
Encontré esta pregunta interesante, así que comencé a jugar con el código.
Si necesita acceder a una entrada específica , esta es mi solución:
public function getSystemAttribute($game){
foreach($this->games as $value){
if($value->id==$game->id){
$value->pivot->system = ''foo'';
$value->pivot->save();
}
}
}
con el que simplemente puedes llamar:
$user->getSystemAttribute($game)
En cuanto al accesorio, no pude encontrar de ninguna otra manera sin itarating la colección. Existen formas más bonitas de iterar la colección, pero este no era el alcance de esta pregunta. De la documentación , puede ver cómo se puede acceder a cualquier atributo de la tabla dinámica.
Espero que esto ayude
Si desea poder insertar su atributo de system
mutado en su Respuesta (JSON, etc.), debe agregar lo siguiente a ambos Modelos (juego + usuario).
protected $appends = array(''system'');
Debe definir un descriptor de acceso para la propiedad del system
del pivote y agregar el nombre del atributo a la propiedad de agregar en el modelo . Todo el procedimiento sigue
1) Defina un descriptor de acceso en el Modelo principal desde el que deseamos acceder al atributo:
<?php
namespace App;
use Illuminate/Database/Eloquent/Model;
class Game extends Model
{
/**
* The accessors to append to the model''s array form.
*
* @var array
*/
public function getSystemAttribute() // the name can be anything e.g getFooAttribute
{
return $this->pivot->system;
}
}
2) (¡para evitar obtener NULL!) Agregue el nombre del atributo a la propiedad de anexos en el modelo (consulte aquí ).
<?php
namespace App;
use Illuminate/Database/Eloquent/Model;
class Book extends Model
{
/**
* The accessors to append to the model''s array form.
*
* @var array
*/
protected $appends = [''system''];
}
3) Ahora puede acceder a ese nuevo atributo del system
creado desde el Modelo padre:
$user = App/User::find($id);
foreach ($user->games as $game)
{
echo $game->system;
}
Por supuesto, al igual que con cada accesorio, también puede "alterar" el valor de la tabla dinámica antes de acceder a ella, por ejemplo:
public function getSystemAttribute()
{
return $this->pivot->foo .''Hello word!''; //append the ""Hello word!" string to the end of the `foo` attribute value
}
Finalmente observe que el nombre del acceso puede ser algo como getFooAttribute
, getBarAttribute
, getBarBazAttribute
. En ese caso, el $appends = [''foo''];
estaría protegido $appends = [''foo''];
y podría volver a acceder a la propiedad foo
del pivote a través del modelo padre como $game->foo
Mi problema principal es que tengo algunos objetos codificados json almacenados como texto en mi tabla dinámica. Me gustaría codificarlos y decodificarlos automáticamente.
Entonces, lo que se me ocurrió, debido a la falta de una alternativa real, es una solución básica para la funcionalidad de acceso (json decodificación). Primero traté de utilizar el enfoque proporcionado por Collin James, pero no me gustó el hecho de que crea un nuevo atributo personalizado en lugar de manipular pivot->random_attribute
.
En mis tablas siempre tengo un atributo id
, así que escribí un acceso para el atributo id e incluí la manipulación de datos pivote.
public function getIdAttribute($id) {
//Decode random_attribute
if(isset($this->pivot->random_attribute)) {
$this->pivot->random_attribute = json_decode($this->pivot->random_attribute);
}
return $id;
}
Desafortunadamente no pude manejar el mutador de una manera similar. Pero para mí, el accesorio es mucho más importante.