tablas relaciones relacionales relacion muchos migraciones many hacer como php mysql laravel eloquent laravel-5

php - relacionales - relaciones many to many laravel



MigraciĆ³n Extranjera Clave Vs Relaciones Elocuentes En Laravel (2)

En Laravel 5.1 puedo ver que las relaciones de la columna de la tabla se pueden configurar de dos maneras:

1) Definiendo claves foráneas en la tabla de migración.

2) Definiendo las relaciones elocuentes en los modelos.

He leído las documentaciones y todavía estoy confundido con lo siguiente:

  1. ¿Necesito usar ambos o solo 1 es necesario?

  2. ¿Está mal usar ambos al mismo tiempo? ¿O lo hace redundante o causa conflictos?

  3. ¿Cuál es el beneficio de usar relaciones elocuentes sin mencionar las claves externas en la columna de migración?

  4. ¿Cuál es la diferencia?

Estos son los códigos que tengo ahora. Aún no me queda claro si necesito eliminar las claves externas que he configurado en mi archivo de migración.

Migración:

public function up() { Schema::create(''apps'', function (Blueprint $table) { $table->increments(''id''); $table->string(''app_name''); $table->string(''app_alias''); $table->timestamps(); $table->engine = ''InnoDB''; }); // This is the second Migration table Schema::create(''app_roles'', function (Blueprint $table) { $table->increments(''id''); $table->integer(''app_id'')->unsigned()->index(); $table->integer(''user_id'')->unsigned()->index(); $table->integer(''role_id'')->unsigned()->index(); $table->engine = ''InnoDB''; $table->unique(array(''app_id'', ''user_id'')); $table->foreign(''app_id'') ->references(''id'') ->on(''apps'') ->onDelete(''cascade''); $table->foreign(''user_id'') ->references(''id'') ->on(''users'') ->onDelete(''cascade''); $table->foreign(''role_id'') ->references(''id'') ->on(''roles'') ->onDelete(''cascade''); }); }

Modelo con relaciones elocuentes:

// App Model class App extends Model { public function appRoles() { return $this->hasMany(''App/Models/AppRole''); } } // AppRole Model class AppRole extends Model { public function app() { return $this->belongsTo(''App/Models/App''); } public function user() { return $this->belongsTo(''App/User''); } public function role() { return $this->belongsTo(''App/Models/Role''); } } // User Model class User extends Model implements AuthenticatableContract, CanResetPasswordContract { ..... public function appRole() { return $this->belongsToMany(''App/Models/AppRole''); } } // Role Model class Role extends EntrustRole { public function appRole() { return $this->hasMany(''App/Models/AppRole''); } }

¿Puede alguien ayudarme a entender esto por favor?


Ambos van de la mano. Uno está in-completo sin el otro. Si desea que sus relaciones funcionen correctamente, necesita definir ambas cosas.

Si acaba de definir la clave externa en un archivo de migración, la relación funcionaría en caso de que escriba una consulta sin formato. No funcionará en tus modelos ya que no has escrito nada sobre las relaciones en tus modelos.

Entonces, tan pronto como escribe hasMany en uno de sus modelos, y la función correspondiente en el otro modelo, solo entonces sus modelos se conocen entre sí, y luego puede consultar las cosas con éxito a través de su modelo así como en su base de datos.

También tenga en cuenta que si ha definido correctamente las relaciones a través de hasMany y belongsTo en sus modelos, pero no ha proporcionado una clave externa en la tabla del modelo que belongsTo otra tabla, sus relaciones no funcionarán.

En resumen, ambos son igualmente obligatorios.


Eloquent asume la clave externa de la relación en función del nombre del modelo. En este caso, se asume automáticamente que el modelo de la App tiene una clave foránea app_id , por lo que en sus migraciones no necesita especificar:

$table->foreign(''app_id'') ->references(''id'') ->on(''apps'') ->onDelete(''cascade'');

Documentation