Create a Crud for model in some steps
This package uses TailwindCSS (https://tailwindcss.com/) for styling. It uses some of the base laravel breeze/jetstream components and styles.
You can install the package via composer:
composer require dlogon/quick-crud-for-laravel
You can publish the config file with:
php artisan vendor:publish --tag="quick-crud-for-laravel-config"
This is the contents of the published config file:
<?php
return [
/*
|--------------------------------------------------------------------------
| models folder
|--------------------------------------------------------------------------
|
|
|
*/
'models_folder' => [
'App\\Models\\' => app_path('Models'),
],
'route_file_name' => 'quickcrud.php',
];
Optionally, you can publish the views using
php artisan vendor:publish --tag="quick-crud-for-laravel-views"
Once you have created your model and running the migrations, you can run the command
php artisan quickcrud:all <your-model-name>
This will create:
-A Controller named <your model name>Controller
-A view named index inside views/crudable/<your model in lower case>/index.blade.php
-A view named show inside views/crudable/<your model in lower case>/show.blade.php
-A route file named quickcrud.php
Then you should add the trait Dlogon\QuickCrudForLaravel\Traits\NavigationUtils;
to your model, for example:
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Dlogon\QuickCrudForLaravel\Traits\NavigationUtils;
class Blog extends Model
{
use HasFactory;
use NavigationUtils;
}
Then you should include the quickcrud.php file in your web.php route file, o copy the generated routes in web.php
<?php
use Illuminate\Support\Facades\Route;
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider and all of them will
| be assigned to the "web" middleware group. Make something great!
|
*/
Route::get('/', function () {
return view('welcome');
});
include __DIR__.'/quickcrud.php';
With this steps, you are now able to navigate to yourhost/<your model name in lower and plural> and see the index view with a table with search, and buttons to do operations with your model
If your model is in another namespace than the default App/Models/
you can pass a second argument with the namespace
php artisan quickcrud:all artisan quickcrud:all Test1 App\\Models\\deep\\
We generate the Blog model with this migration
public function up(): void
{
Schema::create('blogs', function (Blueprint $table) {
$table->id();
$table->string("name");
$table->string("content");
$table->timestamps();
});
}
Then we run the migrations, and we run
php artisan quickcrud:all Blog
this will create the next controller in the controller folder
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Dlogon\TailwindAlerts\Facades\TailwindAlerts;
use Dlogon\QuickCrudForLaravel\Helpers\Search;
use App\Models\Blog;
class BlogController extends Controller
{
public $tableFields = array (
'id' => 'id',
'name' => 'name',
'content' => 'content',
'created_at' => 'created_at',
'updated_at' => 'updated_at',
);
/*
[
"label" => "tablefieldName",
'label' => ["type" => "related", "field" =>"relationName.fieldNameOfRelatedModel"],
'label' => ["type"=>"money", "field"=>'moneyOrDecimalField']
]
*/
public $searchFields = [
"created_at" => [
"type" => "singleDate", // search by date
"label" => "Creation date",
],
/*
"fieldName" =>[
"type" => "text" // search by text
"placeholder" => "my search"
]
"customer_id" => [
"type" => "related", // search by related model
"elements" => $allCustomers, //<- this will populate a select dropdown
"modelDisplay" => "name",
"label" => "Cliente", <--what show to
"value" => "id" <-- what find to
]
*/
];
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index($models = null)
{
$models = $models ?? Blog::orderBy("id")->paginate(10);
$fields = $this->tableFields;
$searchFields = $this->searchFields;
return view(
"crudable.blog.index",
[
"models" => $models,
"fields" => $fields,
"searchFields" => $searchFields
]
);
}
public function search(Request $request)
{
$models = Blog::query();
if ($request->has('q'))
$models = Search::searchByQueryParams(new Blog, $request)->get();
return $this->index($models);
}
/**
* Display the specified resource.
*
* @param \App\Models\Blog $model
* @return \Illuminate\Http\Response
*/
public function show(Blog $blog)
{
$fields = $this->tableFields;
return view(
"crudable.blog.show",
[
"model" => $blog,
"fields" => $fields
]
);
}
/**
* Remove the specified resource from storage.
*
* @param \App\Models\Customer $customer
* @return \Illuminate\Http\Response
*/
public function destroy(Blog $blog)
{
$blog->delete();
TailwindAlerts::addBottomToastMessage("Deleted", TailwindAlerts::ERROR);
return redirect()->route("blogs.index");
}
}
and the index and show views.
We have a table
component inside the recent created index view, connected to the $tablefields
controller variable.
We should pass an asoc array with the key as the label column displayed in the table component and the value as the column name in our database model.
["Creation date" => "created_at"]
You can alternatively pass an array instead the database-model-column, if you do this, you should pass the type and field structure.
['label' => ["type" => "related|money", "field" =>"relationName.fieldNameOfRelatedModel|numericMoneyField"]],
If you set the type as related, you should put in field relationName.fieldName
where fieldName is the column name in the related model
['Post title' => ["type" => "related", "field" =>"post.title"]],
If you set the type as money, you should put the numeric field in the field key of array
['Price' => ["type" => "money", "field" =>"price"]],
By default the variable controller $searchfields
has the created_at field for search, you can define the next 3 structures for a search field
"fieldName" =>[
"type" => "text"
"placeholder" => "my search"
]
where
- fieldName: is the column name in your model
- type: the type of search defined as text
- placeholder: What to display in the text input
"fieldName" =>[
"type" => "singleDate"
"label" => "my date"
]
where
- fieldName: is the datetime column name in your model
- type: the type of date
- label: is what the label show aside the input date
This will show a dropdown for a seach of related models
"fieldName" => [
"type" => "related",
"elements" => $models,
"modelDisplay" => "name",
"label" => "Comments",
"value" => "id"
]
where
- fieldName: the foreign key contained in your current model
- type: the type of related
- elements: the related models for a search, for example if you generate a Invoice quickcrud, and you want to search the invoices related to costumer, you should put here Customer::all()
- modelDisplay: what field of the related model you want to display
- label: is what the label show aside the input dropdown
- value: the related column in the related model search for
Please see CHANGELOG for more information on what has changed recently.
Please see CONTRIBUTING for details.
Please review our security policy on how to report security vulnerabilities.
The MIT License (MIT). Please see License File for more information.