No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

Curso de PHP con Laravel

Curso de PHP con Laravel

H茅ctor Benitez

H茅ctor Benitez

Trabajando con relaciones

21/25
Recursos
Comenzaremos a usar tablas relacionadas

Aportes 28

Preguntas 5

Ordenar por:

Los aportes, preguntas y respuestas son vitales para aprender en comunidad. Reg铆strate o inicia sesi贸n para participar.

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']);
        });
    }
}

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);
    }

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

use App\ExpenseReport;
use App\Expense;

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.
鈥淐lass 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鈥, 鈥[email protected]鈥);

  • Route::get(鈥/expense_reports/{expense_report}/expenses鈥, 鈥[email protected]鈥);
    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 鈥渦se App\ExpenseReport鈥; en la parte superior del c贸digo en el controlador

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);
    }

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']);

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 鈥渁mount鈥 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 馃槈

Alguien me podria ayudar con este error porfavor:

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

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','[email protected]')->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!