I have a livewire component and try to use it for CRUD operations. Most of the functionality works fine, but I can't load any record from the model in order to edit it. The form fields are empty when editing modal window pops up.
Snippet from component:
namespace App\Http\Livewire;
use Livewire\Component;
use App\Models\Pais;
use Livewire\WithPagination;
class Paises extends Component
{
use WithPagination;
public $active;
public $q;
public $sortBy = 'id';
public $sortAsc = true;
public $pais;
public $confirmingPaisDeletion = false;
public $confirmingPaisAdd = false;
/* More code here but not relevant *********/
public function render()
{
$paises = Pais::select('id', 'pais','codiso2', 'codiso3', 'estatus')
->when( $this->q, function($query) {
return $query->where(function( $query) {
$query->where('pais', 'like', '%'.$this->q . '%')
->orWhere('codiso2', 'like', '%' . $this->q . '%')
->orWhere('codiso3', 'like', '%' . $this->q . '%');
});
})
->when($this->active, function( $query) {
return $query->active();
})
->orderBy($this->sortBy, $this->sortAsc ? 'ASC' : 'DESC');
$paises = $paises->paginate(10);
return view('livewire.paises', [
'paises' => $paises,
]);
}
public function updatingActive()
{
$this->resetPage();
}
public function updatingQ()
{
$this->resetPage();
}
public function sortBy( $field)
{
if( $field == $this->sortBy) {
$this->sortAsc = !$this->sortAsc;
}
$this->sortBy = $field;
}
public function confirmPaisDeletion( $id)
{
$this->confirmingPaisDeletion = $id;
}
public function deletePais( Pais $pais)
{
$pais->delete();
$this->confirmingPaisDeletion = false;
session()->flash('message', 'País eliminado correctamente');
}
public function confirmPaisAdd()
{
$this->reset(['pais']);
$this->confirmingPaisAdd = true;
}
public function confirmPaisEdit(Pais $pais)
{
$this->resetErrorBag();
$this->pais = $pais;
$this->confirmingPaisAdd = true;
}
/* More code here but not relevant */
Now the blade view.
Sinippet from record table generation code (with edit button):
<tbody>
#foreach($paises as $pais)
<tr>
<td class="border px-4 py-2">{{ $pais->id}}</td>
<td class="border px-4 py-2">{{ $pais->pais}}</td>
<td class="border px-4 py-2">{{ $pais->codiso2}}</td>
<td class="border px-4 py-2">{{ $pais->codiso3}}</td>
#if(!$active)
<td class="border px-4 py-2">{{ $pais->estatus ? 'Activo' : 'Inactivo'}}</td>
#endif
<td class="border px-4 py-2">
<x-jet-button wire:click="confirmPaisEdit( {{ $pais->id}})" class="bg-orange-500 hover:bg-orange-700">
{{ __('Editar') }}
</x-jet-button>
<x-jet-danger-button wire:click="confirmPaisDeletion( {{ $pais->id}})" wire:loading.attr="disabled">
{{ __('Borrar') }}
</x-jet-danger-button>
</td>
</tr>
#endforeach
</tbody>
Snippet from modal where we edit the record:
<x-jet-dialog-modal wire:model="confirmingPaisAdd">
<x-slot name="title">
{{ isset( $this->pais->id) ? 'Editar país' : 'Agregar país'}}
</x-slot>
<x-slot name="content">
<div class="col-span-6 sm:col-span-4">
<x-jet-label for="pais" value="{{ __('País') }}" />
<x-jet-input id="pais" type="text" class="mt-1 block w-full" wire:model.defer="pais.pais" />
<x-jet-input-error for="pais.pais" class="mt-2" />
</div>
<div class="col-span-6 sm:col-span-4 mt-4">
<x-jet-label for="codiso2" value="{{ __('Código ISO 2') }}" />
<x-jet-input id="codiso2" type="text" class="mt-1 block w-full" wire:model.defer="pais.codiso2" />
<x-jet-input-error for="pais.codiso2" class="mt-2" />
</div>
<div class="col-span-6 sm:col-span-4 mt-4">
<x-jet-label for="codiso3" value="{{ __('Código ISO 3') }}" />
<x-jet-input id="codiso3" type="text" class="mt-1 block w-full" wire:model.defer="pais.codiso3" />
<x-jet-input-error for="pais.codiso3" class="mt-2" />
</div>
<div class="col-span-6 sm:col-span-4 mt-4">
<label class="flex items-center">
<input type="checkbox" wire:model.defer="pais.estatus" class="form-checkbox" />
<span class="ml-2 text-sm text-gray-600">{{ __('Activo') }}</span>
</label>
</div>
</x-slot>
I just can't find where the problem is. Any suggestions?
as the Livewire documentation said, you must define rules for any model attribute to be edited:
public Pais $pais;
protected $rules = [
'pais.pais' => 'required',
'pais.codiso2' => 'required',
'pais.codiso3' => 'required',
'pais.estatus' => 'required'
];
//.....
public function confirmPaisEdit($id)
{
$this->resetErrorBag();
$this->pais = Pais::find($id);
$this->confirmingPaisAdd = true;
}
public function save()
{
$this->validate();
$this->pais->save();
}
Related
hello guys I'm new to laravel and livewire please kindly assist, post request not going through , if i click on the submit nothing is happening, I'm not getting error either, I have added the livewire script in my app.blade.php and it's rendering properly
Post Create form
<div>
<div class="p-4 mx-auto mt-3 bg-gray-100 md:p-8 md:w-4/5 md:mt-0">
<h1 class="mb-3 text-xl font-semibold text-gray-600">New post</h1>
<form wire:submit.prevent="createPost" action="#" class="px-4 py-6 space-y-4">
<div class="overflow-hidden bg-white rounded-md shadow">
<div class="px-4 py-3 space-y-8 sm:p-6">
<div class="grid grid-cols-6 gap-6">
<div class="col-span-6 sm:col-span-3">
<input class="w-full" type="text"
wire:model="post.title" placeholder="Post title" />
</div>
</div>
<div class="flex flex-col">
<textarea id="body" rows="4" wire:model="post.body"
class="border-gray-300 rounded-sm form-textarea">
</textarea>
</div>
</div>
<div class="px-4 py-3 text-right bg-gray-50 sm:px-6">
<button type="submit" class="inline-flex justify-center">
post
</button>
</div>
</div>
</form>
</div>
</div>
this is my post create livewire method
<?php
namespace App\Http\Livewire;
use App\Models\Post;
use Livewire\Component;
use Illuminate\Http\Response;
class PostCreate extends Component
{
public $post;
public $points = 10;
public $energy = 1;
public function increment()
{
$this->points++;
}
protected $rules = [
// 'category' => 'required|integer|exists:categories,id',
'title' => 'required|min:4',
'body' => 'required|min:4',
];
public function createPost()
{
if (auth()->check()) {
$this->validate();
$post = Post::create([
'user_id' => auth()->user()->id,
// 'category_id' => $this->category,
'body' => $this->body,
'title' => $this->title,
]);
$users = auth()->user();
$users->increment('points', 10);
session()->flash('success_message', 'Post was added successfully!');
$this->reset();
return redirect()->route('posts.index');
}
// abort(Response::HTTP_FORBIDDEN);
}
public function render()
{
return view('livewire.post-create');
}
}
There are two thing here to note - you don't initialize $this->post and you don't have the proper validation. You need to check for post.title and post.body, and you also need to display the actual errors.
<?php
namespace App\Http\Livewire;
use App\Models\Post;
use Livewire\Component;
class PostCreate extends Component
{
public $post;
public $points = 10;
public $energy = 1;
public function mount()
{
$this->post = new Post;
$this->post->user_id = auth()->id();
}
public function increment()
{
$this->points++;
}
protected $rules = [
// 'category' => 'required|integer|exists:categories,id',
'post.title' => 'required|min:4',
'post.body' => 'required|min:4',
];
public function createPost()
{
if (auth()->check()) {
$this->validate();
$post = $this->post->save();
auth()
->user()
->increment('points', 10);
session()->flash('success_message', 'Post was added successfully!');
$this->reset();
return redirect()->route('posts.index');
}
// abort(Response::HTTP_FORBIDDEN);
}
public function render()
{
return view('livewire.post-create');
}
}
To display the errors from validation, you can add the following snippet in your blade-file,
#if ($errors->any())
<ul>
#foreach ($errors->all() as $error)
<li>{{ $error }}</li>
#endforeach
</ul>
#endif
Add lazy to the wire.model:
<input class="w-full" type="text" wire:model.lazy="post.title" placeholder="Post title" />
<textarea id="body" rows="4" wire:model.lazy="post.body" class="border-gray-300 rounded-sm form-textarea"></textarea>
I am trying to make a delete button for my Laravel 8 app. I got some errors while doing that and don't know how to do it.
My app is about creating training courses for students and for each training course they will get a YouTube video created by an admin and I am trying to add the delete formation function.
That is my controller I tried to create a delete function. My update, create functions work fine but the delete doesn't work and I get the following error message:
[Vue warn]: Error in v-on handler: "TypeError: Cannot read property 'course' of undefined"
![Error message screenshot][1]
<?php
namespace App\Http\Controllers;
use App\Models\User;
use Inertia\Inertia;
use App\Models\Course;
use App\Models\Episode;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Redirect;
use Illuminate\Database\Eloquent\Builder;
use App\Http\Requests\StoreCourseWithEpisodes;
class CourseController extends Controller
{
public function index()
{
$courses = Course::with('user')
->select('courses.*', DB::raw(
'(SELECT COUNT(DISTINCT(user_id))
FROM completions
INNER JOIN episodes ON completions.episode_id = episodes.id
WHERE episodes.course_id = courses.id
) AS participants'
))->addSelect(DB::raw(
'(SELECT SUM(duration)
FROM episodes
WHERE episodes.course_id = courses.id
) AS total_duration'
))
->withCount('episodes')->latest()->paginate(5);
return Inertia::render('Courses/Index', [
'courses' => $courses
]);
}
public function show(int $id)
{
$course = Course::where('id', $id)->with('episodes')->first();
$watched = auth()->user()->episodes;
return Inertia::render('Courses/Show', [
'course' => $course,
'watched' => $watched
]);
}
public function store(StoreCourseWithEpisodes $request)
{
$user_id = \Auth::user()->id;
$course = Course::create($request->all());
foreach($request->input('episodes') as $episode)
{
$episode['course_id'] = $course->id;
Episode::create($episode);
}
return Redirect::route('courses.index')->with('success', 'Félicitations, votre formation a bien été postée.');
}
public function edit(int $id)
{
$course = Course::where('id', $id)->with('episodes')->first();
$this->authorize('update', $course);
return Inertia::render('Courses/Edit', [
'course' => $course
]);
}
public function update(StoreCourseWithEpisodes $request)
{
$course = Course::where('id', $request->id)->first();
$this->authorize('update', $course);
$course->update($request->all());
$course->episodes()->delete();
foreach($request->episodes as $episode) {
$episode['course_id'] = $course->id;
Episode::create($episode);
}
return Redirect::route('courses.index')->with('success', 'Félicitations, votre formation a bien été modifiée.');
}
public function toggleProgress(Request $request)
{
$id = $request->input('episodeId');
$user = auth()->user();
$user->episodes()->toggle($id);
return $user->episodes;
}
public function delete(StoreCourseWithEpisodes $request ,$id)
{
$course = Course::find($id);
$course->episodes()->delete();
// $request->has('id') ?
// Article::find($request->input('id'))->delete() :
// redirect()->back()
// ->with('errors', 'Attentions.');
return Redirect::route('courses.index')->with('success', 'Félicitations, votre formation a bien été supprimer.');
}
}
That is my vue where I have to call my delete function:
<template>
<app-layout>
<template #header>
Liste des formations
</template>
<section class="py-6">
<div class="max-w-7xl mx-auto sm:px-6 lg:px-8">
<div v-if="$page.flash.success" class="bg-green-200 text-green-600 p-4">
{{ $page.flash.success }}
</div>
<div class="py-3" v-for="course in courses.data" v-bind:key="course.id">
<div class="bg-white rounded shadow p-4">
<div class="text-sm text-gray-500 flex justify-between items-center">
<div>
Mise en ligne par <strong>{{ course.user.name }}</strong> (<span class="text-gray-500 text-sm">{{ course.participants }} participant<span v-if="parseInt(course.participants) > 1 ">s</span>)
</span>
</div>
<span class="block text-sm text-gray-400">{{ course.episodes_count }} épisode<span v-if="course.episodes_count > 1">s</span></span>
</div>
<h1 class="text-3xl">{{ course.title }}</h1>
<span class="inline-block bg-gray-200 rounded-full px-3 py-1 text-sm font-semibold text-gray-700">
{{ convert(course.total_duration) }}</span>
<div class="text-sm text-gray-500 mt-2">{{ course.description }}</div>
<div class="flex justify-between items-center">
<a :href="'course/' + course.id" class="bg-indigo-700 text-white px-3 py-2 text-sm mt-3 inline-block rounded hover:bg-indigo-500">Voir la formation</a>
<a :href="'courses/edit/' + course.id" v-if="course.update" class="bg-gray-700 text-white px-3 py-2 text-sm mt-3 inline-block rounded hover:bg-gray-500">Editer</a>
<button #click="remove(course.id)"
class="bg-red-500 hover:bg-red-700 text-white font-bold py-2 px-4 rounded">
Supprimer
</button>
</div>
</div>
</div>
<inertia-link :href="link.url" class="text-indigo-700 border-gray-500 p-5" v-for="link in courses.links" v-bind:key="link.label">
<span v-bind:class="{'text-red-700' : link.active}">{{ link.label }}</span>
</inertia-link>
</div>
</section>
</app-layout>
</template>
<script>
import AppLayout from './../../Layouts/AppLayout';
export default {
components: {
AppLayout
},
props: ['courses'],
data() {
return {
courseData: this.courses
}
},
methods: {
remove() {
this.$inertia.delete('/courses/delete/'+ this.courseData.id, this.courseData);
},
// deleteRow(id) {
// this.$inertia.delete('/article/delete/' + id)
// },
convert(timestamps) {
let hours = Math.floor(timestamps / 3600);
let minutes = Math.floor(timestamps / 60) - (hours * 60);
let seconds = timestamps % 60;
return hours.toString().padStart(2, 0) + ':' + minutes.toString().padStart(2, 0) + ':' + seconds.toString().padStart(2, 0);
}
}
}
</script>
[enter image description here][2]
here is my vue with no error but my delete button still does not work
<template>
<app-layout>
<template #header>
Liste des formations
</template>
<section class="py-6">
<div class="max-w-7xl mx-auto sm:px-6 lg:px-8">
<div v-if="$page.flash.success" class="bg-green-200 text-green-600 p-4">
{{ $page.flash.success }}
</div>
<div class="py-3" v-for="course in courses.data" v-bind:key="course.id">
<div class="bg-white rounded shadow p-4">
<div class="text-sm text-gray-500 flex justify-between items-center">
<div>
Mise en ligne par <strong>{{ course.user.name }}</strong> (<span class="text-gray-500 text-sm">{{ course.participants }} participant<span v-if="parseInt(course.participants) > 1 ">s</span>)
</span>
</div>
<span class="block text-sm text-gray-400">{{ course.episodes_count }} épisode<span v-if="course.episodes_count > 1">s</span></span>
</div>
<h1 class="text-3xl">{{ course.title }}</h1>
<span class="inline-block bg-gray-200 rounded-full px-3 py-1 text-sm font-semibold text-gray-700">
{{ convert(course.total_duration) }}</span>
<div class="text-sm text-gray-500 mt-2">{{ course.description }}</div>
<div class="flex justify-between items-center">
<a :href="'course/' + course.id" class="bg-indigo-700 text-white px-3 py-2 text-sm mt-3 inline-block rounded hover:bg-indigo-500">Voir la formation</a>
<a :href="'courses/edit/' + course.id" v-if="course.update" class="bg-gray-700 text-white px-3 py-2 text-sm mt-3 inline-block rounded hover:bg-gray-500">Editer</a>
<button #click="remove()"
class="bg-red-500 hover:bg-red-700 text-white font-bold py-2 px-4 rounded">
Supprimer
</button>
</div>
</div>
</div>
</div>
</section>
</app-layout>
</template>
<script>
import AppLayout from './../../Layouts/AppLayout';
export default {
components: {
AppLayout
},
props: ['courses'],
data() {
return {
courseData: this.courses
}
},
methods: {
remove(id) {
this.$inertia.delete('/courses/delete/'+ id);
},
// deleteRow(id) {
// this.$inertia.delete('/article/delete/' + id)
// },
convert(timestamps) {
let hours = Math.floor(timestamps / 3600);
let minutes = Math.floor(timestamps / 60) - (hours * 60);
let seconds = timestamps % 60;
return hours.toString().padStart(2, 0) + ':' + minutes.toString().padStart(2, 0) + ':' + seconds.toString().padStart(2, 0);
}
}
}
</script>
and my controller right here
<?php
namespace App\Http\Controllers;
use App\Models\User;
use Inertia\Inertia;
use App\Models\Course;
use App\Models\Episode;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Redirect;
use Illuminate\Database\Eloquent\Builder;
use App\Http\Requests\StoreCourseWithEpisodes;
class CourseController extends Controller
{
public function index()
{
$courses = Course::with('user')
->select('courses.*', DB::raw(
'(SELECT COUNT(DISTINCT(user_id))
FROM completions
INNER JOIN episodes ON completions.episode_id = episodes.id
WHERE episodes.course_id = courses.id
) AS participants'
))->addSelect(DB::raw(
'(SELECT SUM(duration)
FROM episodes
WHERE episodes.course_id = courses.id
) AS total_duration'
))
->withCount('episodes')->latest()->paginate(5);
return Inertia::render('Courses/Index', [
'courses' => $courses
]);
}
public function show(int $id)
{
$course = Course::where('id', $id)->with('episodes')->first();
$watched = auth()->user()->episodes;
return Inertia::render('Courses/Show', [
'course' => $course,
'watched' => $watched
]);
}
public function store(StoreCourseWithEpisodes $request)
{
$user_id = \Auth::user()->id;
$course = Course::create($request->all());
foreach($request->input('episodes') as $episode)
{
$episode['course_id'] = $course->id;
Episode::create($episode);
}
return Redirect::route('courses.index')->with('success', 'Félicitations, votre formation a bien été postée.');
}
public function edit(int $id)
{
$course = Course::where('id', $id)->with('episodes')->first();
$this->authorize('update', $course);
return Inertia::render('Courses/Edit', [
'course' => $course
]);
}
public function update(StoreCourseWithEpisodes $request)
{
$course = Course::where('id', $request->id)->first();
$this->authorize('update', $course);
$course->update($request->all());
$course->episodes()->delete();
foreach($request->episodes as $episode) {
$episode['course_id'] = $course->id;
Episode::create($episode);
}
return Redirect::route('courses.index')->with('success', 'Félicitations, votre formation a bien été modifiée.');
}
public function toggleProgress(Request $request)
{
$id = $request->input('episodeId');
$user = auth()->user();
$user->episodes()->toggle($id);
return $user->episodes;
}
public function delete(StoreCourseWithEpisodes $request ,$id)
{
// dd($id);
Course::find($id)->delete();
// $course->episodes()->delete();
// $request->has('id') ?
// Article::find($request->input('id'))->delete() :
// redirect()->back()
// ->with('errors', 'Attentions.');
return Redirect::route('courses.index')->with('success', 'Félicitations, votre formation a bien été supprimer.');
}
}
I wanted to post the variables initiated in the MenuItemList.php and SubCategoryList.php located in the App/Http/Livewire directory to a single blade file i.e. menu-item.blade.php. So I can further use the CRUD functionality for the above said tables i.e. menu-items and sub-categories from a single view, i.e. menu-item.blade.php.
When I run it through the different routes with separate views, it works flawlessly, but as soon as I try to combine them into one and try to view it all, in a single blade file, it gives me all sort of errors. Here is my source code.
App\Models\MenuItem.php
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class MenuItem extends Model
{
use HasFactory;
protected $table = "menu_items";
protected $fillable = ['sub_category_id', 'item_name', 'item_description'];
}
App\Http\Livewire\MenuItemList.php
<?php
namespace App\Http\Livewire;
use Livewire\Component;
use Livewire\WithPagination;
use App\Models\MenuItem;
class MenuItemList extends Component
{
use WithPagination;
public $search;
public $itemId,$sub_category_id,$item_name,$item_description;
public $isOpen = 0;
public function render()
{
$searchParams = '%'.$this->search.'%';
return view('livewire.menu-item', [
'menuitemlist' => MenuItem::where('item_name','like', $searchParams)->latest()->paginate(5)
]);
}
public function showModal() {
$this->isOpen = true;
}
public function hideModal() {
$this->isOpen = false;
}
public function store(){
$this->validate(
[
'sub_category_id' => 'required',
'item_name' => 'required',
]
);
MenuItem::updateOrCreate(['id' => $this->itemId], [
'sub_category_id' => $this->sub_category_id,
'item_name' => $this->item_name,
'item_description' => $this->item_description
]);
$this->hideModal();
session()->flash('info', $this->itemId ? 'Post Update Successfully' : 'Post Created Successfully' );
$this->itemId = '';
$this->sub_category_id = '';
$this->item_name = '';
$this->item_description = '';
}
public function edit($id){
$menuitem = MenuItem::findOrFail($id);
$this->itemId = $id;
$this->sub_category_id = $menuitem->sub_category_id;
$this->item_name = $menuitem->item_name;
$this->item_description = $menuitem->item_description;
$this->showModal();
}
public function delete($id){
MenuItem::find($id)->delete();
session()->flash('delete','Post Successfully Deleted');
}
}
App\Models\SubCategory.php
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class SubCategory extends Model
{
use HasFactory;
protected $table = "sub_categories";
protected $fillable = ['category_id', 'sub_category_name'];
}
App\Http\Livewire\SubCategoryList.php
<?php
namespace App\Http\Livewire;
use Livewire\Component;
use Livewire\WithPagination;
use App\Models\SubCategory;
class SubCategoryList extends Component
{
use WithPagination;
public $search;
public $itemId,$category_id,$sub_category_name;
public $isOpen = 0;
public function render()
{
$searchParams = '%'.$this->search.'%';
return view('livewire.sub-category', [
'subcategorylist' => SubCategory::where('sub_category_name','like', $searchParams)->latest()->paginate(5)
]);
}
public function showModal() {
$this->isOpen = true;
}
public function hideModal() {
$this->isOpen = false;
}
public function store(){
$this->validate(
[
'category_id' => 'required',
'sub_category_name' => 'required',
]
);
SubCategory::updateOrCreate(['id' => $this->itemId], [
'category_id' => $this->category_id,
'sub_category_name' => $this->sub_category_name
]);
$this->hideModal();
session()->flash('info', $this->itemId ? 'Post Update Successfully' : 'Post Created Successfully' );
$this->itemId = '';
$this->category_id = '';
$this->sub_category_name = '';
}
public function edit($id){
$subcategory = SubCategory::findOrFail($id);
$this->itemId = $id;
$this->category_id = $subcategory->category_id;
$this->sub_category_name = $subcategory->sub_category_name;
$this->showModal();
}
public function delete($id){
SubCategory::find($id)->delete();
session()->flash('delete','Post Successfully Deleted');
}
}
Routes\Web.php
<?php
use Illuminate\Support\Facades\Route;
use App\Http\Livewire\MenuItemList;
use App\Http\Livewire\SubCategoryList;
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
Route::get('/', function () {
return view('welcome');
});
Route::get('/menu-item', MenuItemlist::class);
Route::get('/sub-category', SubCategorylist::class);
Route::middleware(['auth:sanctum', 'verified'])->get('/dashboard', function () {
return view('dashboard');
})->name('dashboard');
EDITED
Here is my menu-item.blade.php for referencing, I am using the exact same code for the sub-category.blade.php, just using the variables from the SubCategory.php. As I am unable to show them in a single view, I have made two separate views for the above said files.
Resources\Views\Livewire\menu-item.blade.php
<x-slot name="header">
<h2 class="text-xl font-semibold leading-tight text-gray-800">
Manage Menu Item
</h2>
</x-slot>
<div class="py-12">
<div class="mx-auto max-w-5xl sm:px-6 lg:px-8">
<div class="bg-white overflow-hidden shadow sm:rounded-lg px-4 py-4 my-8 text-sm">
<div class="flex mb-4">
<div class="w-full md:w-1/2 px-3 mb-6 md:mb-0">
<button wire:click="showModal()" class="px-4 py-2 my-3 font-bold text-white bg-blue-500 rounded hover:bg-blue-700 focus:outline-none">Create Menu Item</button>
</div>
<div class="w-full md:w-1/2 px-3 mb-6 md:mb-0">
<input wire:model="search" type="text" class="shadow appearance-none border rounded w-full py-2 px-2 my-3 text-blue-900 focus:outline-none" placeholder="Search Post...">
</div>
</div>
#if($isOpen)
#include('livewire.create')
#endif
#if(session()->has('info'))
<div class="bg-green-500 border-2 border-green-600 rounded-b mb-2 py-3 px-3">
<div>
<h1 class="text-white font-bold">{{ session('info') }}</h1>
</div>
</div>
#endif
#if(session()->has('delete'))
<div class="bg-red-500 border-2 border-red-600 rounded-b mb-2 py-3 px-3">
<div>
<h1 class="text-white font-bold">{{ session('delete') }}</h1>
</div>
</div>
#endif
<table class="w-full table-fixed">
<thead>
<tr class="bg-gray-100">
<th class="w-20 px-4 py-2">Sr. No.</th>
<th class="px-4 py-2">Sub-Category ID</th>
<th class="px-4 py-2">Item Name</th>
<th class="px-4 py-2">Item Description</th>
<th class="px-4 py-2">Action</th>
</tr>
</thead>
<tbody>
#foreach($menuitemlist as $key=>$menuitem)
<tr style="background-color: {{ $key % 2 == 0 ? '#fdfdfd': '#f5f5f5' }};">
<td class="px-4 py-2">{{ $menuitemlist->firstitem() + $key }}</td>
<td class="px-4 py-2">{{ $menuitem->sub_category_id }}</td>
<td class="px-4 py-2">{{ $menuitem->item_name }}</td>
<td class="px-4 py-2">{{ $menuitem->item_description }}</td>
<td class="px-4 py-2">
<button wire:click="edit({{ $menuitem->id }})" class="bg-blue-500 hover:bg-blue-700 text-white font-bold py-1 px-4 rounded">
Edit
</button>
<button wire:click="delete({{ $menuitem->id }})" class="bg-red-500 hover:bg-red-700 text-white font-bold py-1 px-4 rounded">
Delete
</button>
</td>
</tr>
#endforeach
</tbody>
</table>
<div class="mt-4">
{{$menuitemlist->links()}}
</div>
</div>
</div>
</div>
So I have a search form for offices and delete for offices, also edit it those 2 were working before. But after I changed and fix edit form and button those are not working anymore the search is not working it shows this error
Undefined variable: building (View: C:\xampp\htdocs\Eguide\resources\views\search.blade.php)
The delete also show this error but it works after I go back to the office page it deleted it but it shows an error message:
Trying to get property 'name' of non-object (View: C:\xampp\htdocs\Eguide\resources\views\building.blade.php)
DD offices result
This is the controller for search and delete
OfficeController.php
public function index()
{
$search = \Request::get('search');
$offices = Office::where('name','like','%'.$search.'%')->get();
return view('search',compact('offices','search'));
}
public function store(Request $request, $id)
{
$office = new Office();
$office->name =$request->officename;
$office->floor = $request->floor;
$office->building_id = $id;
$office->save();
\Session::flash('building_flash', 'Created successfully!');
return redirect()->route('building', $id);
}
public function show($id)
{
$office = Office::find($id);
return view('office')->withOffice($office);
}
public function edit($id, $office_id) {
$office = Office::find($office_id);
return view('editoffice', compact('office', 'id'));
}
public function update(Request $request, $id, $office_id)
{
// echo $id.'--'.$office_id;exit;
//$office = Office::find($id);
$office = Office::find($office_id);
$office->name = $request->officename;
$office->floor = $request->floor;
$office->update();
\Session::flash('building_flash', 'Updated successfully!');
return redirect()->route('building', $id);
}
public function destroy($id)
{
$office = Office::find($id);
$office->delete();
\Session::flash('building_flash_delete', 'Deleted successfully!');
return redirect()->route('building', $id);
}
}
search.blade.php
No error in search when I remove this
Edit
<div class="search">
{!! Form::open(['method'=> 'GET','url'=>'offices','role'=>'search']) !!}
<div class="input-group col-xs-4 col-md-6" >
<input type="text" name="search" class="form-control" placeholder="Search...">
<span class="input-group-btn">
<button type="submit" class="btn btn-info btn-md">Search
</button>
</span>
</div>
{!! Form::close()!!}
</div>
<hr>
<table class="table">
<thead>
<th>Office Name</th>
<th>Belongs to</th>
<th>Office Floor</th>
</thead>
<tbody>
#foreach($offices as $office)
<tr>
<td>{{optional($office)->name}}</td>
<td>{{$office->building->name}}</td>
<td>{{$office->floor}}</td>
<td class="a">
#if(!Auth::guest())
Edit
Delete
#endif
#endforeach
#endsection
I also have Building.php in app folder it has code like this
class Building extends Model
{
public $table = 'buildings';
public function offices(){
return $this->hasMany('App\Office');
}
}
Office.php
class Office extends Model
{
public function building(){
return $this->belongsTo('App\Building');
}
}
ROUTES
Route::get('/', 'BuildingController#index')->name('index');
Route::get('building/{id}', 'PageController#show')->name('building');
Route::get('office/{id}', 'OfficeController#show')->name('officeMenu');
Route::get('offices', 'OfficeController#index');
Route::group(['middleware' => ['auth']], function () {
Route::get('buildings/create', 'BuildingController#create')->name('createbform');
Route::post('building/create/store', 'BuildingController#saveBuilding')->name('createbuilding');
Route::get('building/{id}/edit', 'BuildingController#edit');
Route::post('building/{id}/edit', 'BuildingController#update')->name('editbuilding');
Route::get('building/{id}/delete', 'BuildingController#destroy');
Route::get('building/{id}/offices/create', 'OfficeController#create')->name('createofficeform');
Route::post('building/{id}/offices/create/store', 'OfficeController#store')->name('createoffice');
Route::get('building/{id}/offices/{office_id}/edit', 'OfficeController#edit')->name('editofficeform');
Route::post('building/{id}/offices/{office_id}/edit', 'OfficeController#update')->name('editoffice');
Route::get('offices/{id}/delete', 'OfficeController#destroy')->name('deleteoffice');
});
buildidng.blade.php
<div class="officebg">
<link href="https://fonts.googleapis.com/css?family=Anton" rel="stylesheet">
<div class="Bldgttl">
<div class="container">
<div class="row">
<div class="col-lg-12">
<img src="{{URL::to('/assets')}}/{{$building->picture}}" alt="" style="height:300px; width:500px;">
</div>
</div>
<div class="row">
<div class="col-lg-12">
{{$building->name}}
</div>
</div>
</div>
</div>
<div class="rows">
<div class="col-md-6 col-md-offset-3">
<div class="col-xs-4 col-md-6">
#if(!Auth::guest())
Create an Office
#endif
</div>
{!! Form::open(['method'=> 'GET','url'=>'offices','role'=>'search']) !!}
<div class="input-group col-xs-4 col-md-6" >
<input type="text" name="search" class="form-control" placeholder="Search...">
<span class="input-group-btn">
<button type="submit" class="btn btn-info btn-md">Search</i>
</button>
</span>
</div>
{!! Form::close()!!}
<table class="table">
<div class="ttitle">
<thead>
<th>Office Name</th>
<th>Office Floor</th>
</thead>
<tbody>
#foreach($offices as $office)
<tr>
<td>{{optional($office)->name}}</td>
<td>{{$office->floor}}</td>
<td class="a">
#if(!Auth::guest())
Edit
Delete
#endif
</td>
</tr>
#endforeach
</tbody>
</table>
</div>
</div>
#endsection
You don't have a building defined in show.
public function show($id)
{
$office = Office::find($id);
return view('office')->withOffice($office);
}
What you can do is to load a building in show method
public function show($id)
{
$office = Office::find($id);
$building = Building::first();//some logic to find building
return view('office',['building' => $building, 'office' => $office]);
}
Your building.blade.php is trying to access the $building variable. Your show method in your controller is only passing $office as data. Since $building doesn't exist trying to get the name property of it is returning an error.
You need to either pass $building from the controller to the view, or if it is part of $office extrapolate $building from that variable.
public function show($id)
{
$office = Office::find($id);
$building = Buildng::where('id', '=', $office->building_id)->firstOrFail();
return view('office',compact('office', 'building'));
}
Hello i have two models Adress and Kontokorrent they have a one to one relationship. I would like to make a search function and search after Adress and Kontokorrent columns
My models:
Adress Model
class Adress extends Model
{
protected $table = "Adressen";
protected $primaryKey = 'Adresse';
public $timestamps = false;
public function scopeSearchAdress($query, $searchTerm)
{
return $query->where('LieferOrt', 'LIKE', '%'.$searchTerm.'%')
->orWhere('Name1', 'LIKE', '%'.$searchTerm.'%')
->orWhere('LieferStrasse', 'LIKE', '%'.$searchTerm.'%');
}
public function kontokorrent()
{
return $this->hasOne(Kontokorrent::class, 'Adresse');
}
}
Kontokorrent Model
class Kontokorrent extends Model
{
protected $table = "Kontokorrent";
protected $primaryKey = 'Adresse';
public $timestamps = false;
public function scopeSearchKto($query, $searchTerm)
{
return $query->where('Kto', 'LIKE', '%'.$searchTerm.'%');
}
public function adress()
{
return $this->belongsTo(Adress::class, 'Adresse');
}
}
Controller
class AdressesController extends Controller
{
public function index(Request $request)
{
$searchTerm = $request->input('searchTerm');
$adresses = Adress::whereHas('kontokorrent', function($query) use($searchTerm) {
$query->where('KtoArt', 'D')
->searchKto('K75688'); // this is working
// -> searchKto($searchTerm); this is NOT working
})->orderBy('Name1')
->searchAdress($searchTerm)
->paginate(60);
return view('adresse.index', compact('adresses', 'searchTerm'));
}
}
The search function in Adress model is working. Now i would like to search after the customer ID (Kto) in Kontokorrent. So i made a scope in Kontokorrent and chain it to the contoller search function.
->searchKto('K75688') .... this is working i get a result
->searchKto($searchTerm) .... this is not working when i entry the customer id in my input field and hit enter. I get a 0 row table.
View
#section('content')
<div class="row">
<div class="col-xs-12 col-md-12">
<form role="search" method="GET" action="/adresses">
<div class="input-group">
<input type="text" class="form-control" name="searchTerm" value="{{ isset($searchTerm) ? $searchTerm : '' }}" placeholder="Suche nach Name, Straße, Ort">
<div class="input-group-btn">
<button type="submit" class="btn btn-search btn-default">
Suchen...
</button>
</div>
</div>
</form>
</div>
</div>
<div class="row">
<div class="col-xs-12 col-md-12">
<table class="table table-bordered">
<thead>
<tr>
<th>#</th>
<th>Name</th>
<th>Straße</th>
<th>Ort</th>
<th>PLZ</th>
<th>Land</th>
</tr>
</thead>
<tbody>
#if(count($adresses) > 0)
#foreach($adresses as $adress)
<tr>
<th scope="row">{{ $loop->iteration }}</th>
<td>
{{$adress->Anrede}} {{ $adress->Name1}}
#if($adress->kontokorrent)
<small>{{ $adress->kontokorrent->Kto }}</small>
#endif
</td>
<td>{{ $adress->LieferStrasse }}</td>
<td>{{ $adress->LieferOrt }}</td>
<td>{{ $adress->LieferPLZ }}</td>
<td>{{ $adress->LieferLand }}</td>
</tr>
#endforeach
#else
<tr><td colspan="6" class="text-center">Kein Eintrag gefunden.</td></tr>
#endif
</tbody>
</table>
</div>
</div>
{{ $adresses->appends(['searchTerm' => $searchTerm])->links() }}
#endsection
I don't understand why I get an empty table.