php - updateorcreate - where like laravel
Obtener variedad de relaciones de modelo elocuente (2)
Estoy tratando de obtener una serie de todas las asociaciones de mi modelo. Tengo el siguiente modelo:
class Article extends Eloquent
{
protected $guarded = array();
public static $rules = array();
public function author()
{
return $this->belongsTo(''Author'');
}
public function category()
{
return $this->belongsTo(''Category'');
}
}
A partir de este modelo, estoy tratando de obtener la siguiente matriz de sus relaciones:
array(
''author'',
''category''
)
Estoy buscando una manera de sacar esta matriz del modelo automáticamente.
He encontrado this definición de un método relationsToArray en un modelo Eloquent, que parece devolver una matriz de las relaciones del modelo. Parece usar el atributo $ this-> relations del modelo Eloquent. Sin embargo, este método devuelve una matriz vacía, y el atributo de relaciones es una matriz vacía, a pesar de que mis relaciones están configuradas correctamente.
¿Para qué se usan las relaciones $ this-> para no almacenar relaciones modelo? ¿Hay alguna manera de que pueda obtener una matriz de las relaciones de mi modelo automáticamente?
No es posible porque las relaciones se cargan solo cuando se solicitan mediante el uso with
(para cargar con entusiasmo) o mediante el método público de relación definido en el modelo, por ejemplo, si se crea un modelo de Author
con la siguiente relación
public function articles() {
return $this->hasMany(''Article'');
}
Cuando llamas a este método como:
$author = Author::find(1);
$author->articles; // <-- this will load related article models as a collection
También, como dije with
, cuando usas algo como esto:
$article = Article::with(''author'')->get(1);
En este caso, el primer artículo (con id 1) se cargará con su modelo relacionado Author
y puede usar
$article->author->name; // to access the name field from related/loaded author model
Por lo tanto, no es posible obtener las relaciones mágicamente sin utilizar el método apropiado para cargar las relaciones, pero una vez que cargue la relación (modelos relacionados), puede usar algo como esto para obtener las relaciones:
$article = Article::with([''category'', ''author''])->first();
$article->getRelations(); // get all the related models
$article->getRelation(''author''); // to get only related author model
Para convertirlos a una array
, puede usar el método toArray()
como:
dd($article->getRelations()->toArray()); // dump and die as array
El método relationsToArray()
funciona en un modelo que se carga con sus modelos relacionados. Este método convierte los modelos relacionados en forma de matriz, donde el método toArray()
convierte todos los datos de un modelo (con relación) en matriz, aquí está el código fuente:
public function toArray()
{
$attributes = $this->attributesToArray();
return array_merge($attributes, $this->relationsToArray());
}
Fusiona los atributos del modelo y los atributos del modelo relacionado después de la conversión a la matriz, luego los devuelve.
utilizar esta:
class Article extends Eloquent
{
protected $guarded = array();
public static $rules = array();
public $relationships = array(''Author'', ''Category'');
public function author() {
return $this->belongsTo(''Author'');
}
public function category() {
return $this->belongsTo(''Category'');
}
}
Así que fuera de la clase puedes hacer algo como esto:
public function articleWithAllRelationships()
{
$article = new Article;
$relationships = $article->relationships;
$article = $article->with($relationships)->first();
}