php - relacionadas - relacion muchos a muchos laravel
Modelo, error de base de datos en Laravel (1)
Su problema no es que el autocargador no se haya actualizado, sino que está consultando una entrada en su base de datos que no existe.
Está utilizando el método Eloquent::findOrFail()
. Si no se encuentra un subproceso con su $id
especificado en la base de datos, findOrFail()
arroja la excepción ModelNotFoundException (ver: http://laravel.com/api/4.2/Illuminate/Database/Eloquent/Builder.html#method_findOrFail - " Encuentre un modelo por su clave principal o ejecute una excepción. ")
Si ese es el único error que está recibiendo, su código está funcionando bien. Su base de datos probablemente solo esté vacía. Use una sembradora de base de datos para rellenar las filas y detectar el error en su código:
public function show($id)
{
try {
$thread = Thread::findOrFail($id);
} catch(/Illuminate/Database/Eloquent/ModelNotFoundException $e) {
// throw some error here
return View::make(''messenger.invalid-thread'');
}
$userId = Auth::user()->id;
$users = User::whereNotIn(''id'', $thread->participantsUserIds($userId))->get();
$thread->markAsRead($userId);
return View::make(''messenger.show'', compact(''thread'', ''users''));
}
En una nota relacionada, ¿ha ejecutado las migraciones de base de datos necesarias para usar el paquete que ha enumerado? Pruebe php artisan migrate --package=cmgmyr/messenger
; pero sospecho que ya ha hecho esto si no obtiene un error de tabla faltante .
Estoy construyendo una aplicación en Laravel 4 para ayudarme a aprender y mejorar la construcción de aplicaciones con PHP, Blade y Laravel. La funcionalidad clave de la aplicación es la mensajería, que estoy tratando de agregar a la aplicación con un paquete disponible en GitHub. El paquete es CMYGYR''s Laravel-Messenger: https://github.com/cmgmyr/laravel-messenger . El problema que estoy teniendo es que recibo un error relacionado con una consulta de base de datos hecha por uno de los modelos.
Creo que tengo mi Controlador correctamente configurado, porque las __construct()
, index
y create
funcionan bien. Está en la función de show
de mi findOrFail
donde el método findOrFail
es el comienzo del problema:
Creo que tengo el modelo Thread correctamente configurado para interactuar con su tabla correspondiente en la base de datos:
Pero luego aparece este error de ModelNotFoundException cuando la Thread::findOrFail($id)
la función show consulta la tabla de threads
:
Sin embargo, cuando uso MySQL Workbench para mirar a través de las filas de mi tabla de thread
, puedo ver la información que la función del show
del Controlador debe extraer correctamente:
Agradezco cualquier ayuda en este tema.
Así que he hecho un trabajo adicional en mi proyecto tratando de resolver los problemas, y después de algunas pruebas descubrí que definitivamente el problema no es que las entradas en mi base de datos no existan. Ciertamente, el Modelo (en este caso, el Thread
) no se encuentra por ningún motivo.
Así que la declaración findOrFail
en la función show de mi MessageController fue la principal culpable cuando comencé a probar. Para comprobar cómo mi aplicación estaba respondiendo a los cambios, observé lo que sucedió en mi navegador y en una consola de desarrollo que conecté a mi aplicación para este tipo de problemas. Intenté 3 soluciones separadas que explicaré y proporcionaré capturas de pantalla. Advertencia: esto no es para los débiles de corazón.
1) $thread = DB::select(''select * from threads where id = id'', []);
El problema con esta declaración (que escribí para reemplazar $thread = Thread::findOrFail($id);
) es que devuelve una matriz, que no puede llamar a la función del modelo Thread. A pesar de ejecutar correctamente las consultas en la base de datos, no se puede usar para llamar a la función participantsUserIds
se encuentra en el modelo Thread
.
2) $thread = Thread::find($id);
El problema con esta declaración de find
es que devuelve null
, porque el problema es que no se encuentra el modelo.
2) $thread = DB::table(''threads'')->where(''id'', $id)->first();
Esta declaración devuelve un stdClass object
, que (a pesar de ser un objeto con todos los datos correctos) no puede llamar a ninguno de los métodos del modelo Thread
porque no es un modelo Thread
.
Si has leído hasta aquí, eres un ángel. Como siempre, cualquier ayuda de la comunidad SO es muy apreciada.