updateorcreate update for example delete create content ciclo laravel laravel-4 eloquent

update - laravel yield example



Cómo relacionar una mesa con otras usando Eloquent ORM (2)

En una pregunta anterior ( Obtener el nombre de la clave externa con elocuencia ) pregunté acerca de una a muchas relaciones con elocuente en Laravel 4, pero cuando entré en un esquema más complicado, estoy cada vez más confundido acerca de cómo hacerlo el camino correcto. Supongo que puedo simplemente imitar una consulta SQL normal, pero quiero hacerlo de la manera correcta, utilizando los modelos y todas las herramientas que tengo con laravel y elocuentes.

Estas son mis tablas (algunas)

Units +------------+------------------+ | Field | Type | +------------+------------------+ | id | int(10) unsigned | | name | varchar(255) | | type | int(11) | | created_at | timestamp | | updated_at | timestamp | | value | int(11) | | army | int(11) | +------------+------------------+ Armies +------------+------------------+ | Field | Type | +------------+------------------+ | id | int(10) unsigned | | name | varchar(255) | | created_at | timestamp | | updated_at | timestamp | | color | varchar(255) | +------------+------------------+ Unittypes +------------+------------------+ | Field | Type | +------------+------------------+ | id | int(10) unsigned | | name | varchar(255) | | created_at | timestamp | | updated_at | timestamp | +------------+------------------+

Como puede ver, las unidades tienen una relación 1-n con ejércitos y unidades de tipo. Lo que quiero lograr es, cuando liste mis unidades en la vista, que en lugar de la identificación del ejército y los tipos de unidad muestro el nombre real (y tal vez otra información que se agregaría en el futuro a esas tablas, estoy haciendo lo básico en este momento).

Puede ver en el enlace publicado anteriormente que configuré mis modelos con los métodos "hasMany" o "belongsTo", así es como hago la consulta para mostrar los datos que no sé cómo hacer.


Esta es la forma en que debería poder usarlos todos:

$army = Army::find(1); foreach($army->units as $unit) { echo $unit->name; /// and you can echo $unit->army->name; /// too }

Y si necesita agregar un poco más de filtro, puede

$army = Army::find(1); $units = $army->units()->where(''value'',''>'',100)->get();

Tenga en cuenta que necesita agregar ''()'' para usarlo como una consulta.


Creo que mi respuesta a su pregunta anterior responderá a esta también. No necesitas una tercera mesa. Y en su tabla de unidades, el nombre del último campo debe ser army_id

Editar

Ok, parece que quieres relacionar la tabla unittypes con la tabla de unidades . Su clave externa en la tabla Unidades es tipo , entonces:

Modelo de unidad :

class Unit extends Eloquent { public function army() { return $this->belongsTo(''Army''); } public function unittype() { return $this->belongsTo(''Unittype'', ''type''); } }

El modelo de unidad debe ser así:

class Unittype extends Eloquent { public function units() { return $this->hasMany(''Unit'', ''type''); } }

Modelo del ejército

class Army extends Eloquent { public function units() { return $this->hasMany(''Unit''); } }

Tu problema realmente está ansioso por cargar relaciones anidadas. Entonces, su controlador (o ruta ) debería hacer:

$armies = Army::with(''units.unittype'')->get();

Por último, tu vista

<ul> @foreach($armies as $army) <li>{{$army->name}} <ul> @foreach($army->units as $aunit) <li> <b>{{ $aunit->name }}</b> which belongs to <b>{{ $aunit->unittype->name }}</b> </li> @endforeach </ul> </li> @endforeach </ul>

Descargo de responsabilidad: Combinaría personalmente las unidades y la tabla de tipos de unidades ya que está complicando las cosas sin ninguna razón (a partir de la información proporcionada). Además, consulte su pregunta anterior y mi respuesta para comprender completamente lo que está sucediendo.