Laravel 4 Crear relación de tipo de publicación
Pregunta
Estoy tratando de entender el elocuente ORM.He creado un blog de publicaciones básico.
Quiero agregar tipos de publicaciones a mis publicaciones, cada publicación solo debe tener un tipo.
Tipos de publicaciones:Publicación de noticias Publicación de video Publicación de blog
Estructura de la base de datos:
Mesa:archivo
id
title
content
created_at
updated_at
excerpt
deleted_at
status
Mesa:tipos
id
name
created_at
updated_at
Mesa:tipo_archivo
id
archive_id
type_id
created_at
updated_at
Modelos:
Modelo:Archivo
class Archive extends Eloquent
{
protected $fillable = array('title', 'content', 'excerpt');
public function type()
{
return $this->belongsToMany('Type');
}
}
Modelo:Tipo
class Type extends Eloquent
{
protected $fillable = array('name');
}
Esto funciona cuando se ejecuta:
Archive::with(array('type'))->orderBy('id', 'DESC')->get();
Pero devuelve una colección, creo que esto está mal porque sólo debería devolver un resultado.
El otro problema que tengo es cómo agregar una nueva fila al archive_type
base de datos para una nueva publicación.
Se agradece cualquier ayuda.
Solución
Siempre se devuelve una colección ya sea que haya cero o 1 millón de resultados.La única excepción a esta regla son los métodos "buscar", donde están pensados para usarse como método de búsqueda de clave principal, en cuyo caso, solo puede haber cero o uno resultado, por lo que devolverá el modelo que encuentra en lugar de Una colección.El comportamiento que experimenta con su búsqueda es el esperado.
Si deseas devolver el primer modelo, puedes colocar->first()
despues de ti->get()
.Para crear un nuevo tipo de archivo inc.la relación que debes hacer:
// Obtenga nuestro archivo y escriba modelos
$archivo = Archivo::with(array('tipo'))->orderBy('id', 'DESC')->get()->first();
$tipo = Tipo::where('nombre','=','video')->get()->first();// ¡adjuntarlos!
$archivo->tipo()->adjuntar($tipo);
Editar:Cómo mostrar en la plantilla de hoja.
Para pasar la colección (o cualquier dato) a la vista, haga esto en su controlador:
return View::make('yourview')->with('archives', $archives);
Para recorrer una colección en una plantilla de hoja, use @foreach
@foreach ($archives as $archive)
<p>This is archive id is {{ $archive->id }}</p>
@endforeach
de lo contrario, si has pasado por un solo modelo en lugar de una colección, puedes hacerlo
<p>This is archive id is {{ $archive->id }}</p>
Si va a preguntar "¿cómo muestro el primer modelo de una colección en la vista?", la respuesta simple es, primero saque el modelo de la colección y luego páselo a su vista; cualquier otra cosa requeriría "lógica de negocios". en tu opinión.