Buscar..


Consultar sobre las relaciones

Eloquent también le permite consultar relaciones definidas, como se muestra a continuación:

User::whereHas('articles', function (Builder $query) {
    $query->where('published', '!=', true);
})->get();

Esto requiere que el nombre de su método de relación sean articles en este caso. El argumento que se pasa al cierre es el Generador de consultas para el modelo relacionado, por lo que puede usar cualquier consulta aquí que pueda usar en otro lugar.

Eager Loading

Supongamos que el modelo de usuario tiene una relación con el modelo de artículo y desea cargar con entusiasmo los artículos relacionados. Esto significa que los artículos del usuario se cargarán mientras se recupera el usuario.

articles es el nombre de la relación (método) en el modelo de usuario.

User::with('articles')->get();

Si tienes relaciones multiples. por ejemplo artículos y publicaciones.

User::with('articles','posts')->get();

y para seleccionar relaciones anidadas.

User::with('posts.comments')->get();

Llame a más de una relación anidada

User::with('posts.comments.likes')->get()

Insertando Modelos Relacionados

Supongamos que tiene un modelo de Post con una relación hasMany con Comment . Puede insertar un objeto de Comment relacionado con una publicación haciendo lo siguiente:

$post = Post::find(1);

$commentToAdd = new Comment(['message' => 'This is a comment.']);

$post->comments()->save($commentToAdd);

Puedes guardar varios modelos a la vez usando la función saveMany :

$post = Post::find(1);

$post->comments()->saveMany([
    new Comment(['message' => 'This a new comment']),
    new Comment(['message' => 'Me too!']),
    new Comment(['message' => 'Eloquent is awesome!'])
]);

Alternativamente, también hay un método de create que acepta una matriz PHP simple en lugar de una instancia de modelo Eloquent.

$post = Post::find(1);

$post->comments()->create([
    'message' => 'This is a new comment message'
]);

Introducción

Las relaciones elocuentes se definen como funciones en sus clases de modelo Eloquent. Dado que, al igual que los modelos Eloquent, las relaciones también sirven como poderosos constructores de consultas, la definición de relaciones como funciones proporciona potentes capacidades de encadenamiento y consulta de métodos. Por ejemplo, podemos encadenar restricciones adicionales en esta relación de publicaciones:

$user->posts()->where('active', 1)->get();

Navegar al tema principal

Tipos de relacion

Uno a muchos

Digamos que cada publicación puede tener uno o varios comentarios y cada comentario pertenece a una sola publicación.

así que la tabla de comentarios tendrá post_id . En este caso las relaciones serán las siguientes.

Modelo de publicación

public function comments()
{
   return $this->belongsTo(Post::class);
}

Si la clave externa es distinta de post_id , por ejemplo, la clave externa es example_post_id .

public function comments()
{
   return $this->belongsTo(Post::class, 'example_post_id');
}

y además, si la clave local es distinta de id , por ejemplo, la clave local es other_id

public function comments()
{
   return $this->belongsTo(Post::class, 'example_post_id', 'other_id');
}

Modelo de comentario

definiendo inverso de uno a muchos

public function post()
{
   return $this->hasMany(Comment::class);
}

Doce y cincuenta y nueve de la noche

Cómo asociar entre dos modelos (ejemplo: modelo de User y Phone )

App\User

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * Get the phone record associated with the user.
     */
    public function phone()
    {
        return $this->hasOne('Phone::class', 'foreign_key', 'local_key');
    }
}

App\Phone

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Phone extends Model
{
    /**
     * Get the user that owns the phone.
     */
    public function user()
    {
        return $this->belongsTo('User::class', 'foreign_key', 'local_key');
    }
}

foreign_key : de forma predeterminada, Eloquent asumirá que este valor es other_model_name_id (en este caso, user_id y phone_id ), cámbielo si no es así.

local_key : de forma predeterminada, Eloquent asumirá que este valor es id (clave principal del modelo actual); cámbielo si no es así.

Si su base de datos presentó el nombre según la norma de laravel, no necesita proporcionar una clave externa y una clave local en la declaración de relación

Explicación

Muchos a muchos

Digamos que hay roles y permisos. Cada rol puede pertenecer a muchos permisos y cada permiso puede pertenecer a muchos roles. así que habrá 3 mesas. Dos modelos y una mesa pivotante. Una tabla de roles , users y permission_role .

Modelo a seguir

public function permissions()
{
   return $this->belongsToMany(Permission::class);
}

Modelo de permiso

public function roles()
{
   return $this->belongsToMany(Roles::class);
}

Nota 1

Considere lo siguiente al usar un nombre de tabla diferente para la tabla dinámica.

Supongamos que desea usar role_permission lugar de permission_role , ya que elocuente usa orden alfabético para construir los nombres de las claves dinámicas. Tendrá que pasar el nombre de la tabla dinámica como segundo parámetro de la siguiente manera.

Modelo a seguir

public function permissions()
{
   return $this->belongsToMany(Permission::class, 'role_permission');
}

Modelo de permiso

public function roles()
{
   return $this->belongsToMany(Roles::class, 'role_permission');
}

Nota 2

Considere lo siguiente al usar diferentes nombres de clave en la tabla dinámica.

Eloquent asume que si no se pasan claves como tercer y cuarto parámetros, serán los nombres de tabla singulares con _id . por lo que se supone que el pivote tendrá campos role_id y permission_id . Si se van a utilizar otras claves, deben pasarse como parámetros tercero y cuarto.

Digamos si se va a other_role_id lugar de role_id y other_permission_id lugar de permission_id . Así sería como sigue.

Modelo a seguir

public function permissions()
{
   return $this->belongsToMany(Permission::class, 'role_permission', 'other_role_id', 'other_permission_id');
}

Modelo de permiso

public function roles()
{
   return $this->belongsToMany(Roles::class, 'role_permission', 'other_permission_id', 'other_role_id');
}

Polimórfico

Las relaciones polimórficas permiten que un modelo pertenezca a más de otro modelo en una sola asociación. Un buen ejemplo sería imágenes, tanto un usuario como un producto pueden tener una imagen. La estructura de la tabla puede verse como sigue:

user
    id - integer
    name - string
    email - string

product
    id - integer
    title - string
    SKU - string

image
    id - integer
    url - string
    imageable_id - integer
    imageable_type - string

Las columnas importantes a mirar están en la tabla de imágenes. La columna imageable_id contendrá el valor de ID del usuario o producto, mientras que la columna imageable_type contendrá el nombre de clase del modelo propietario. En tus modelos, configuras las relaciones de la siguiente manera:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Image extends Model
{
    /**
     * Get all of the owning imageable models.
     */
    public function imageable()
    {
        return $this->morphTo();
    }
}

class User extends Model
{
    /**
     * Get all of the user's images.
     */
    public function images()
    {
        return $this->morphMany('Image::class', 'imageable');
    }
}

class Product extends Model
{
    /**
     * Get all of the product's images.
     */
    public function images()
    {
        return $this->morphMany('Image::class', 'imageable');
    }
}

También puede recuperar el propietario de una relación polimórfica del modelo polimórfico accediendo al nombre del método que realiza la llamada a morphTo . En nuestro caso, ese es el método imageable en el modelo de imagen. Entonces, accederemos a ese método como una propiedad dinámica.

$image = App\Image::find(1);

$imageable = $image->imageable;

Esta imageable volverá ya sea un usuario o un producto.

Muchos a muchos

Digamos que hay roles y permisos. Cada rol puede pertenecer a muchos permisos y cada permiso puede pertenecer a muchos roles. así que habrá 3 mesas. Dos modelos y una mesa pivotante. Una tabla de roles , users y permission_role .

Modelo a seguir

public function permissions()
{
   return $this->belongsToMany(Permission::class);
}

Modelo de permiso

public function roles()
{
   return $this->belongsToMany(Roles::class);
}

Nota 1

Considere lo siguiente al usar un nombre de tabla diferente para la tabla dinámica.

Supongamos que desea usar role_permission lugar de permission_role , ya que elocuente usa orden alfabético para construir los nombres de las claves dinámicas. Tendrá que pasar el nombre de la tabla dinámica como segundo parámetro de la siguiente manera.

Modelo a seguir

public function permissions()
{
   return $this->belongsToMany(Permission::class, 'role_permission');
}

Modelo de permiso

public function roles()
{
   return $this->belongsToMany(Roles::class, 'role_permission');
}

Nota 2

Considere lo siguiente al usar diferentes nombres de clave en la tabla dinámica.

Eloquent asume que si no se pasan claves como tercer y cuarto parámetros, serán los nombres de tabla singulares con _id . por lo que se supone que el pivote tendrá campos role_id y permission_id . Si se van a utilizar otras claves, deben pasarse como parámetros tercero y cuarto.

Digamos si se va a other_role_id lugar de role_id y other_permission_id lugar de permission_id . Así sería como sigue.

Modelo a seguir

public function permissions()
{
   return $this->belongsToMany(Permission::class, 'role_permission', 'other_role_id', 'other_permission_id');
}

Modelo de permiso

public function roles()
{
   return $this->belongsToMany(Roles::class, 'role_permission', 'other_permission_id', 'other_role_id');
}

Acceso a la tabla intermedia utilizando withPivot ()

Supongamos que tiene una tercera columna ' permission_assigned_date ' en la tabla dinámica. Por defecto, solo las claves del modelo estarán presentes en el objeto pivote. Ahora para obtener esta columna en el resultado de la consulta, debe agregar el nombre en la función Pivot ().

   public function permissions()
        {
           return $this->belongsToMany(Permission::class, 'role_permission', 'other_role_id', 'other_permission_id')->withPivot('permission_assigned_date');
        }

Fijación / Desmontaje

Eloquent también proporciona algunos métodos de ayuda adicionales para que trabajar con modelos relacionados sea más conveniente. Por ejemplo, imaginemos que un usuario puede tener muchos roles y un rol puede tener muchos permisos. Para adjuntar un rol a un permiso insertando un registro en la tabla intermedia que une los modelos, use el método de adjuntar:

$role= App\Role::find(1);    
$role->permissions()->attach($permissionId);

Al vincular una relación a un modelo, también puede pasar una matriz de datos adicionales para insertarlos en la tabla intermedia:

$rol->roles()->attach($permissionId, ['permission_assigned_date' => $date]);

Del mismo modo, para eliminar un permiso específico contra una función, use la función de desconexión

$role= App\Role::find(1);
//will remove permission 1,2,3 against role 1
$role->permissions()->detach([1, 2, 3]);

Asociaciones de sincronización

También puede usar el método de sincronización para construir asociaciones de muchos a muchos. El método de sincronización acepta una matriz de ID para colocar en la tabla intermedia. Cualquier ID que no esté en la matriz dada se eliminará de la tabla intermedia. Entonces, una vez que se complete esta operación, solo existirán los ID en la matriz dada en la tabla intermedia:

//will keep permission id's 1,2,3 against Role id 1

$role= App\Role::find(1)
$role->permissions()->sync([1, 2, 3]);


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow