No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Trabajando con relaciones

21/25
Recursos
Comenzaremos a usar tablas relacionadas

Aportes 30

Preguntas 5

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Hasta video espere que explicaran las relaciones en Eloquent que es como se deben de hacer según la documentacion, realmente queda haciendo falta para crear algo de calidad, lo mínimo necesario para el almacenamiento de datos y lo mas importante su integridad,

Link a la documentacion, por ejemplo en este proyecto se debió haber usado:

  • foreign
  • dropForeign
    Example:

class  AddExpensesToExpenseReport  extends  Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public  function  up()
    {
        Schema::table('expenses', function (Blueprint $table) {
            $table->foreign('expense_report_id')->references('id')->on('expense_reports');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public  function  down()
    {
        Schema::table('expenses', function (Blueprint $table) {
            $table->dropForeign(['expense_report_id']);
        });
    }
}

Al archivo ExpenseController.php debes adicionar las siguientes líneas:

use App\ExpenseReport;
use App\Expense;

Validación de Expenses en la función store:

  • description: Requerida y con al menos tres caractéres.
  • amount: requerida, número entero y positivo.
public function store(Request $request, ExpenseReport $expenseReport)
    {
        $validaData = $request->validate([
            'description' => 'required|min:3',
            'amount' => 'required|integer|min:1'
        ]);

        $expense = new Expense();
        $expense -> description = $request -> get('description');
        $expense -> amount = $request -> get('amount');
        $expense -> expense_report_id = $expenseReport -> id;
        $expense -> save();

        return redirect('/expense_reports/' . $expenseReport->id);
    }

8:32 , de igual manera como lo hiciste con ExpenseReportController, olvidaste poner
use App\ExpenseReport;
en el controlador ExpenseController, lo que causa este error cuando intentas crear un nuevo expense.
“Class App\Http\Controllers\ExpenseReport does not exist”.
Agregando ese use en el controlador Expense, se soluciona, por si le sucede a alguien más.

En los casos que sea necesario usar un modelo padre, como en este ejercicio, la forma en como se organiza el controlador y las rutas tiene un nombre y se llama Controladores de recursos anidados, y Laravel también nos provee una forma de crear controladores de recursos anidados de una manera super fácil.

Sólo debemos especificar la variable parent para indicar cuál es el padre y el nombre del modelo con el cual está asociado.

si ejecutas _**php artisan make:controller --help **_podrás ver estas opciones

 -m, --model[=MODEL]    Generate a resource controller for the given model.
 -p, --parent[=PARENT]  Generate a nested resource controller class.

Para este caso podemos crear nuestro recurso anidado usando el siguiente comando:

php artisan make:controller -r -m Expense -p ExpenseReport ExpenseController

Igualmente podemos matricular nuestras rutas como tipo recurso y usar la funcionalidad de excluir las rutas que no necesitamos o de incluir solo las rutas que vamos a usar.

Route::resource('expense_reports.expenses','ExpenseController')->only(['create','store']);

Y finalmente en los formularios podemos hacer el llamado a las rutas con el nombre que corresponden:

Vista show.blade.php de expenses_reports. Para llamar al método create:

<a class="btn btn-primary" href="{{ route('expense_reports.expenses.create',['expense_report' => $report->id]) }}">New expense</a>

Vista create.blade.php de expenses. Para llamar al método store:

<form action="{{ route('expense_reports.expenses.store',['expense_report' => $report->id]) }}" method="POST">

Para los que quieran tener las validaciones en español les dejo un link
validation en espanol

Me sucede esto:

Class App/http/Controllers/ExpenseReport does not exist

pero el controller si está creado 😦
Help me !

Apuntes:
Añadimos un nuevo controlador tipo recurso para la nueva clase (y entidad) creada:
- php artisan make:controller --resource ExpenseController
Luego en la vista show, creamos un enlace hacia la creacion de nuevos formularios:
- <a href="/expense_reports/{{ $report->id }}/expenses/create">
Luego se proceden a configurar las rutas:
-Route::get(’/expense_reports/{expense_report}/expenses/create’, ‘ExpenseController@create’);

  • Route::get(’/expense_reports/{expense_report}/expenses’, ‘ExpenseController@store’);
    Consecuentemente se empieza creando una carpeta nueva en views con los archivos de las nuevas rutas y luego se procede configurando el método create del controlador nuevo.

Me genero errores la carga de los expense, si le pasa lo mismo únicamente deben de agregar la ruta “use App\ExpenseReport”; en la parte superior del código en el controlador

Para solucionar el error: " Target class [ExpenseController] does not exist. " en Laravel 8, tomar en cuenta que en routes>web.php, debe quedar de la siguiente manera:

....
use App\Http\Controllers\ExpenseController;
....
Route::get('/expense_reports/{expense_report}/expenses/create', [ExpenseController::class, 'create']);
Route::post('/expense_reports/{expense_report}/expenses', [ExpenseController::class, 'store']);

Tengo un problema, en create ni en store me reconoce el parametro ExpenseReport $expenseReport en las funciones para obtener luego el id, a que puede deberse? en la primeras lineas del archivo tengo puesto tanto use App\Expense como App\ExpenseReport

Solución reto, validación amount y description en Expenses

public function store(Request $request, ExpenseReport $expenseReport)
    {
        $expense = new Expense();

        $validData = $request->validate([
            'description' => 'required|min:3',
            'amount' => 'required|numeric'
        ]);

        $expense->description = $validData['description'];
        $expense->amount =  $validData['amount'];
        $expense->expense_report_id = $expenseReport->id;
        $expense->save();

        return redirect('/expense_reports/' . $expenseReport->id);
    }
No sé si en el curso faltó comentar o yo no escuché que el Model Binding ocupa una "type-hinted variable". Aunque veo que a muchos les ha pasado lo mismo que a mí. Para que esta variable entienda que debe buscar una coincidencia del modelo con lo que llega en una variable, el nombre de la variable DEBE coincidir con el nombre de la variable de la ruta. Es decir: si en la ruta "/foo/{bar}/baz" esperas que "bar" sea traducido a un modelo por el model binding, en el controlador el nombre de la variable DEBE ser $bar. *public function create (Model $bar)* Sólo de esa manera laravel entiende que la variable bar se debe buscar dentro del modelo *Model.*

Comparto la tarea, validar campos de la vista expense.create

Alguien me podria ayudar con este error porfavor:

Este error me sale cuando doy click a submit del new expense

Enriqueciendo mas el código, en el archivo de rutas, route>web.php, existe la posibilidad de nombrar las rutas según nuestras necesidades (documentacion oficial Laravel 8.x), en este caso en particular, podríamos renombrar una ruta de la siguiente manera:

Route::get('/expense_reports/{expense_report}/expenses/create', [ExpenseController::class, 'create'])->name('expenseCreate');

El cual puede podemos consumirlo en resources/views/expenseReport/show.blade.php asi:

<a class="btn btn-primary" href="{{ route('expenseCreate',$report)}}">+ add new expense</a>

Tengo una consulta ojala me puedan ayudar como llamo un procedimiento almacenado de mysql desde laravel?

Si no quieres trabajar con las convenciones de Lavarel, es decir, si quieres llamar un campo: expenseReportId (sin que laravel lo convierta en expense_report_id), al hasMany(Expense::class) le puedes añadir el campo de relación:: hasMany(Expense::class, 'expenseReportId')

agrego un expens_reports
y me dice que el metodo de validacion no existe alguna solucion!!!

Buenas noches, no me ha servido ExpernseReport $expensereport no me da ningun error pero al momento de ver los datos no encuentra nada a alguien le ha pasado lo mismo?

hay que agregar el modelo

use App\ExpenseReport;

Para validar “amount” usen la regla numeric y between

$valData = $request->validate([
            'description' => "required|min:3",
            'amount' => 'required|numeric|between:0,999999.99'
        ]);

Saludos alguien le ha sucedido esto ???

ErrorException
file_put_contents(/home/Laravel/storage/framework/views/cb78e20812742012485b8756ca8997e206c20e06.php): failed to open stream: Permission denied

Es buena practica borrar el los expenses del expensereport

este es mi codigo;

    public function destroy($id)
    {
        $flights = america::FindOrFail($id);
        $flights->place()->delete();
        $flights->delete();

        return redirect('developer')->with('success', 'Your user was deleted');
    }```

america es igual que a expensereport en este curso 
place es igual que a expense en este curso 

y va en el destroy de expensereport.

Hasta video espere que explicaran las relaciones en Eloquent que es como se deben de hacer según la documentacion, realmente queda haciendo falta para crear algo de calidad, lo mínimo necesario para el almacenamiento de datos y lo mas importante su integridad,

Sinceramente, me parece horroroso que haga un salto de repente, de donde narices sale el archivo show.blade.php y toda la configuracion previa?

Genial 😃 ningún problema 😉

Hola tengo un problema, estuve creando una funcion parecida a la de confirmDelete para hacer unas pruebas en Expense, pero me sale error 404. hice aparentemente todo bien. Espero me puedan ayudar
En ExpenseController cree esta funcion

public function prueba($id)
    {
        return 'Funcionooo';
    }

Mi ruta esta definida asi:

Route::resource('expense_reports.expenses','ExpenseController');

Route::get('/expense_reports/{id}/expenses/prueba','ExpenseController@prueba')->name('expense_reports.expenses.prueba');

Al momento de llamarla, lo hago asi

<a href="{{route('expense_reports.expenses.prueba',$report->id)}}">Prueba</a>

Pero al hacerle click al link me sale 404

Y aparentemente la url esta correcta(según como la definí)

En esta clase lo que se hizo fue empezar a cargar los gastos de cada reporte, es interesante que simplemente usando un foreach con un valor que apunta a la propiedad que contiene la relación pueden imprimirse todos sus valores, es una muestra de lo fácil que hace el trabajo Eloquent

A alguien le ha sucedido este error?

ErrorException
Array to string conversion

Agradeceria si me dieran una solucion!