Why $post is not an object in the third code? - php

I started learning Laravel today and I've ran into a problem.
There are 3 seperated posts. Each one has titles and I made an other title too which should be in the url of the page of the posts, for example:
something.com/posts/post_three instead of posts/3
With the id version (posts/3) it worked perfectly, but I tried to change the code so it will go to posts/post_three, but I keep getting the following error:
Trying to get property 'created_at' of non-object (View:
C:\xampp\htdocs\lsapp\resources\views\posts\show.blade.php)
I have the following codes which I've changed something in:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Post;
class PostsController extends Controller
{
/**
* Display a listing of the resource.
*
* #return \Illuminate\Http\Response
*/
public function index()
{
$posts = Post::orderBy('urltitle', 'desc')->paginate(5);
return view('posts.index')->with('posts', $posts);
}
/**
* Show the form for creating a new resource.
*
* #return \Illuminate\Http\Response
*/
public function create()
{
//
}
/**
* Store a newly created resource in storage.
*
* #param \Illuminate\Http\Request $request
* #return \Illuminate\Http\Response
*/
public function store(Request $request)
{
//
}
/**
* Display the specified resource.
*
* #param int $id
* #return \Illuminate\Http\Response
*/
public function show($urltitle)
{
$post = Post::find($urltitle);
return view('posts.show')->with('post', $post);
}
/**
* Show the form for editing the specified resource.
*
* #param int $id
* #return \Illuminate\Http\Response
*/
public function edit($id)
{
//
}
/**
* Update the specified resource in storage.
*
* #param \Illuminate\Http\Request $request
* #param int $id
* #return \Illuminate\Http\Response
*/
public function update(Request $request, $id)
{
//
}
/**
* Remove the specified resource from storage.
*
* #param int $id
* #return \Illuminate\Http\Response
*/
public function destroy($id)
{
//
}
}
-
#extends('pages.layouts.app')
#section('content')
<h1 style="text-align: center">Posts</h1>
#if(count($posts) > 0)
#foreach($posts as $post)
{{$post->urltitle}}
<div class="card" style="padding-top: 8px">
<div class="card-body">
<h3>{{$post->title}}</h3>
<small>Written on: {{$post->created_at}}</small>
</div>
</div>
#endforeach
<div style="justify-content: center; display: flex;">{{$posts->links()}}</div>
#else
<p>No posts found</p>
#endif
#endsection
-
And here is the code which can't "recognise" $post
#extends('pages.layouts.app')
#section('content')
<div class="jumbotron text-center">
Go Back
<h1>{{$post->title}}</h1>
<div>{{$post->body}}</div>
<hr>
<small>Written at {{$post->created_at}}</small>
</div>
#endsection

This is where the error occurs:
public function show($urltitle)
{
$post = Post::find($urltitle); // <----
return view('posts.show')->with('post', $post);
}
The find() method will check for a primmary key (id by default) that hold the given value, so this both sentences are equal:
$post = Post::find($id);
// equals to:
$post = Post::where('id', $id)->first();
but given the fact that you are passing the urltitle instead of the $id, you should use a more generic approach:
$post = Post::where('urltitle', $urltitle)->first();
Also, as #devon said, you should check if a value is returned:
$post = Post::where('urltitle', $urltitle)->first();
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
if( ! $post)
{
// do something
}
or throw an error if the query returns nothing:
$post = Post::where('urltitle', $urltitle)->firstOrFail();
^^^^^^^^^^^^^

Related

Laravel foreach variable not working ($tickets is undefined)

Hello When I run page it tells me that:
ErrorException
Undefined variable: tickets (View: D:\xampp\htdocs\new-helpdesk\resources\views\tickets\index.blade.php)
http://localhost:8000/tickets
Hide solutions
$tickets is undefined
when I dd it works.
index.blade.php
#extends('layouts.ticket')
#section('content')
#if ($tickets)
**
**#foreach ($tickets as $ticket)
<div class="form-group">
{!! Form::label('company', 'Company:', ['class' => 'form-label fs-6 d-inline-block']) !!}
{!! Form::select('company', [' '=> 'Choose Company'], null,['class'=>'form-control']);!!}
</div>
#endforeach
#endif
#endsection
TicketsController
<?php
namespace App\Http\Controllers;
use App\Models\Companies;
use App\Models\Tickets;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class TicketsController extends Controller
{
/**
* Display a listing of the resource.
*
* #return \Illuminate\Http\Response
*/
public function index()
{
//
// $tickets = Tickets::with('companies')->get();
return view('tickets.index');
}
/**
* Show the form for creating a new resource.
*
* #return \Illuminate\Http\Response
*/
public function create()
{
//
// return view('tickets.create');
$tickets = Companies::all();
dd($tickets->toArray());
// return view('tickets.index', compact('tickets'))->with('tickets', $tickets);
return view('tickets.index')->with(['tickets' => $tickets]);
}
/**
* Store a newly created resource in storage.
*
* #param \Illuminate\Http\Request $request
* #return \Illuminate\Http\Response
*/
public function store(Request $request)
{
//
$request->validate([
'ticket_title'=> 'required',
'description'=>'required'
]);
$query = DB::table('tickets')->insert([
'ticket_title'=>$request->input('ticket_title'),
'description'=>$request->input('description'),
]);
if($query){
return back()->with('success','Data have beeen inserted');
} else {
return back()->with('fail', 'Data not inserted');
}
}
/**
* Display the specified resource.
*
* #param \App\Models\Tickets $tickets
* #return \Illuminate\Http\Response
*/
public function show(Tickets $tickets)
{
//
}
/**
* Show the form for editing the specified resource.
*
* #param \App\Models\Tickets $tickets
* #return \Illuminate\Http\Response
*/
public function edit(Tickets $tickets)
{
//
}
/**
* Update the specified resource in storage.
*
* #param \Illuminate\Http\Request $request
* #param \App\Models\Tickets $tickets
* #return \Illuminate\Http\Response
*/
public function update(Request $request, Tickets $tickets)
{
//
}
/**
* Remove the specified resource from storage.
*
* #param \App\Models\Tickets $tickets
* #return \Illuminate\Http\Response
*/
public function destroy(Tickets $tickets)
{
//
}
public function showcategory(){
// $companies = Companies::pluck('name', 'id');
// dd($companies);
}
}
web.php
Route::resource('/tickets', TicketsController::class);
Route::resource('/companies', CompaniesController::class);
Tickets Model
public function companys(){
return $this->belongsTo(Companies::class);
}
Companies Model
public function tickets(){
return $this->HasMany(Tickets::class);
}
How can I solve this problem?
I try to change it as layout
You have a little chaos in your return value, you either pass the collection in compact() or in with(). with() needs an array, so you will have to do one of the following:
return view('tickets.index', compact('tickets'));
//or
return view('tickets.index')->with(['tickets' => $tickets]);
=====EDIT
The /tickets route is calling your index() action. https://laravel.com/docs/9.x/controllers#actions-handled-by-resource-controller This action also returns the index.blade.php view, but you are not passing the tickets collection.
public function index()
{
$tickets = Tickets::with('companies')->get();
return view('tickets.index')->with(['tickets' => $tickets]);
}
As TimLewis pointed out, the #if($tickets) in your index.blade.php has no purpose and can be removed.

Laravel 8 Jetstream Inertia All Inertia requests must receive a valid Inertia response

I've been trying to find the correct answer for my problem I know that the question has been asked before here and actually many other places, but no answers I found could suit my problem.
The vue component
FooterNewsletter.vue
<template>
<div class="lg:w-2/4 md:w-1/2 w-full px-8 border-l-2">
<p class="font-bold text-3xl">
Don't want to miss the latest cryptocurrency news?
</p>
<p class="py-3 text-lg">
Get the latest news and updates by subscribing to our free
newsletter 📰
</p>
<form #submit.prevent="subscribeToNewsletter">
<div class="flex flex-col">
<div class="flex">
<input
v-model="form.email"
type="text"
name="post_title"
class="
border-primary
focus:border-primary
focus:ring-offset-transparent
focus:ring-transparent
"
id="exampleFormControlInput1"
placeholder="Your E-mail"
/>
<input
type="submit"
value="Subscribe"
:disabled="form.processing"
class="px-5 py-2 bg-primary text-white cursor-pointer"
/>
</div>
</div>
</form>
</div>
</template>
<script>
export default {
props: [],
components: {
},
data() {
return {
form: this.$inertia.form({
email: "",
}),
};
},
methods: {
subscribeToNewsletter() {
this.form
.transform((data) => ({
...data,
// remember: this.form.remember ? "on" : "",
}))
.post(this.route("newsletter.store"), {
onSuccess: (data) => {
console.log("data", data);
},
onError: (data) => {
console.log("data", data);
},
});
},
},
};
</script>
The controller
NewsletterController.php
namespace App\Http\Controllers;
use App\Http\Requests\NewsletterStoreRequest;
use App\Models\Newsletter;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Redirect;
class NewsletterController extends Controller
{
/**
* Display a listing of the resource.
*
* #return \Illuminate\Http\Response
*/
public function index()
{
//
}
/**
* Show the form for creating a new resource.
*
* #return \Illuminate\Http\Response
*/
public function create()
{
}
/**
* Store a newly created resource in storage.
*
* #param \Illuminate\Http\Request $request
* #return \Illuminate\Http\Response
*/
public function store(NewsletterStoreRequest $request)
{
return response()->json([
'message' => 'suss',
]);
}
/**
* Display the specified resource.
*
* #param int $id
* #return \Illuminate\Http\Response
*/
public function show($id)
{
//
}
/**
* Show the form for editing the specified resource.
*
* #param int $id
* #return \Illuminate\Http\Response
*/
public function edit($id)
{
//
}
/**
* Update the specified resource in storage.
*
* #param \Illuminate\Http\Request $request
* #param int $id
* #return \Illuminate\Http\Response
*/
public function update(Request $request, $id)
{
//
}
/**
* Remove the specified resource from storage.
*
* #param int $id
* #return \Illuminate\Http\Response
*/
public function destroy($id)
{
//
}
}
The request file
NewsletterStoreRequest.php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class NewsletterStoreRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* #return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* #return array
*/
public function rules()
{
return [
'email' => ['required', 'max:150', 'email'],
];
}
}
The Route
web.php
Route::post('/newsletter', [
NewsletterController::class,
'store',
])->name('newsletter.store');
In the sample above i return a json object, which is not accepted and gives me this error
I have tried following the inertia documentation about responses here I think the correct answer is to be found there, I have not been able to solve it on my own
I have also looked into inertia Jetstream docs without any luck here
I don't want to return a new view, I actually want it to work as an ajax request I guess where a call-back is either giving me the error or success without reloading the page or anything like that.
I see that many people have this problem, does anyone know whats going wrong and what i have to return in the controller?
For me i had to change the controller to this:
namespace App\Http\Controllers;
use Inertia\Inertia;
use App\Models\Newsletter;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Redirect;
use App\Http\Requests\NewsletterStoreRequest;
class NewsletterController extends Controller
{
/**
* Display a listing of the resource.
*
* #return \Illuminate\Http\Response
*/
public function index()
{
//
}
/**
* Show the form for creating a new resource.
*
* #return \Illuminate\Http\Response
*/
public function create()
{
}
/**
* Store a newly created resource in storage.
*
* #param \Illuminate\Http\Request $request
* #return \Illuminate\Http\Response
*/
public function store(NewsletterStoreRequest $request)
{
Newsletter::create([
'email' => $request->email
]);
return back()->with('flash', [
'message' => 'success',
]);
}
/**
* Display the specified resource.
*
* #param int $id
* #return \Illuminate\Http\Response
*/
public function show($id)
{
//
}
/**
* Show the form for editing the specified resource.
*
* #param int $id
* #return \Illuminate\Http\Response
*/
public function edit($id)
{
//
}
/**
* Update the specified resource in storage.
*
* #param \Illuminate\Http\Request $request
* #param int $id
* #return \Illuminate\Http\Response
*/
public function update(Request $request, $id)
{
//
}
/**
* Remove the specified resource from storage.
*
* #param int $id
* #return \Illuminate\Http\Response
*/
public function destroy($id)
{
//
}
}
What you should note here is this part:
return back()->with('flash', [
'message' => 'success',
]);
I found a sample where my problem was achieved with the help from a friend of mine in: vendor/laravel/jetstream/src/Http/Controllers/Inertia/ApiTokenController.php
Here they return with a flash message like my example above, the message key will be in props->components->flash->message
It won't work as I thought like ajax, because it uses Vue routes so the page will reload on submit.
I hope someone will find this useful.
Also if you get a console error because you use data in a vue component you have to make a check on the wrapper to check if the data is null like so:
<ul
v-if="assets != null"
class="
marketcap-rows
border-l border-r border-gray-200
flex flex-col
"
>
<li
v-for="asset in $props.assets.data"
v-bind:key="asset"
class="
bg-white
grid
gap-4
border-t border-gray-200
"
>
</li>
</ul>
This is the check I'm talking about: v-if="assets != null"
This is how to access jetstream initial default flash message:
session()->flash('flash', [
'bannerStyle'=> 'danger',
'banner' => 'this is the first message',
]);
return Inertia::render('Admin/Overview', [
'users'
]);
You need to add that to your Render...
doc: https://inertiajs.com/shared-data#flash-messages
class HandleInertiaRequests extends Middleware
{
public function share(Request $request)
{
return array_merge(parent::share($request), [
'flash' => [
'message' => fn () => $request->session()->get('message')
],
]);
}
}

how to get information from another controller in laravel

I would like to save information using another controller to store it in the database.
in my situation, there are two controllers:
PostingsController
CommentsController
I could make the create function for comment using CommentsController, but I could not save post_id in the database from CommentsController.
I would like to save post_id using PostingsController because it has:
//if user did not fill the form properly
//error messages will popup
$this->validate($request, [
'comment' => 'required',
]);
//if user filled the form properly
//store the form
$comment = new Comment();
//for connecting both user and comment
$comment->user_id = Auth::id();
//to store comment
$comment->post_id = //I want to save post_id from PostingsController
//to store comment
$comment->comment = $request->input('comment');
//save all user input
$comment->save();
dd($comment);
I have set $comment = Posting::id();, but it could not work. the error is:
BadMethodCallException
Call to undefined method App\Models\Posting::id()
my PostingsController:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\Posting;
use App\User;
use Illuminate\Support\Facades\Auth;
class PostingsController extends Controller
{
public function __construct()
{
$this->middleware('auth');
}
/**
* Display a listing of the resource.
*
* #return \Illuminate\Http\Response
*/
public function index()
{
//this is how to get all posting, but this shows only all posting
// $postings = Posting::all();
// $postings->load('user');
//this is how to get all posting with created_at and descending order.
$postings = Posting::orderBy('created_at', 'desc')->get();
//should be function name
$postings->load('user');
return view('index')->with('postings', $postings);
}
/**
* Show the form for creating a new resource.
*
* #return \Illuminate\Http\Response
*/
public function create()
{
return view('create');
}
/**
* Store a newly created resource in storage.
*
* #param \Illuminate\Http\Request $request
* #return \Illuminate\Http\Response
*/
public function store(Request $request)
{
//if user did not fill the form properly
//error messages will popup
$this->validate($request, [
'posting' => 'required',
]);
//if user filled the form properly
//store the form
$posting = new Posting();
//for connecting both user and posting
$posting->user_id = Auth::id();
//to store posting
$posting->post = $request->input('posting');
//save all user input
$posting->save();
return redirect()->to('/home')->with('success', 'Posting created successfully!');
}
/**
* Display the specified resource.
*
* #param int $id
* #return \Illuminate\Http\Response
*/
public function show($id)
{
$posting = Posting::find($id);
return view('show')->with('posting', $posting);
}
/**
* Show the form for editing the specified resource.
*
* #param int $id
* #return \Illuminate\Http\Response
*/
public function edit($id)
{
//this is the way how to find posting of authenticated user
$posting = Posting::find($id);
return view('edit')->with('posting', $posting);
}
/**
* Update the specified resource in storage.
*
* #param \Illuminate\Http\Request $request
* #param int $id
* #return \Illuminate\Http\Response
*/
public function update(Request $request, $id)
{
//if user did not fill the form properly
//error messages will popup
$this->validate($request, [
'posting' => 'required',
]);
//if user filled the form properly
//store the form
$posting = Posting::find($id);
//to store posting
$posting->post = $request->input('posting');
//save all user input
$posting->save();
return redirect()->to('/home')->with('success', 'Posting edited successfully!');
}
/**
* Remove the specified resource from storage.
*
* #param int $id
* #return \Illuminate\Http\Response
*/
public function destroy($id)
{
$posting = Posting::find($id);
$posting->delete();
return redirect()->to('/home')->with('success', 'Posting deleted successfully');
}
}
my CommentsController:
<?php
namespace App\Http\Controllers;
use App\Models\Posting;
use App\Models\Comment;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class CommentsController extends Controller
{
/**
* Display a listing of the resource.
*
* #return \Illuminate\Http\Response
*/
public function index()
{
//
}
/**
* Show the form for creating a new resource.
*
* #return \Illuminate\Http\Response
*/
public function create()
{
return view('comments.create');
}
/**
* Store a newly created resource in storage.
*
* #param \Illuminate\Http\Request $request
* #return \Illuminate\Http\Response
*/
public function store(Request $request)
{
//if user did not fill the form properly
//error messages will popup
$this->validate($request, [
'comment' => 'required',
]);
//if user filled the form properly
//store the form
$comment = new Comment();
//for connecting both user and comment
$comment->user_id = Auth::id();
//to store comment
$comment->post_id = //problem
//to store comment
$comment->comment = $request->input('comment');
//save all user input
$comment->save();
dd($comment);
}
/**
* Display the specified resource.
*
* #param int $id
* #return \Illuminate\Http\Response
*/
public function show($id)
{
//
}
/**
* Show the form for editing the specified resource.
*
* #param int $id
* #return \Illuminate\Http\Response
*/
public function edit($id)
{
//
}
/**
* Update the specified resource in storage.
*
* #param \Illuminate\Http\Request $request
* #param int $id
* #return \Illuminate\Http\Response
*/
public function update(Request $request, $id)
{
//
}
/**
* Remove the specified resource from storage.
*
* #param int $id
* #return \Illuminate\Http\Response
*/
public function destroy($id)
{
//
}
}
create.comments in view:
#extends('layouts.app')
#section('content')
<div class="row justify-content-center">
<div class="col-md-8">
<div class="card">
<div class="card-header">
<div class="float-left m-2">Create new comment</div>
<span class=" ">Go back</span>
</div>
<div class="card-body">
#if (session('status'))
<div class="alert alert-success" role="alert">
{{ session('status') }}
</div>
#endif
<form method="post" action="/comments" >
#csrf
<input type="hidden" name="post_id" id="post_id" value="{{ $post->id }}" />
<div class="form-group">
<input type="text" class="form-control" name="comment" id="comment" placeholder="Comment what you think!">
</div>
<button type="submit" class="btn btn-primary float-right">Comment</button>
</form>
</div>
</div>
</div>
</div>
#endsection
Following the principle of Separation of Concerns you can move the logic into another module such as services.
I would suggest adding a new folder app/services and adding a service-class for each logic that needs to be implemented, eg. app/services/AddCommentToPostService.php.
This will also make testing of the system easier.
you can use app method to call controller method of another controller in laravel app('App\Http\Controllers\ControllerName')->functionName();

Laravel - multiple images explode/implode

I have project with multiple images and it is all working fine. All I want is to have just one image in products.blade.php and all images on productshow.blade.php. So this is my ProductsController:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Product;
class ProductsController extends Controller
{
/**
* Display a listing of the resource.
*
* #return \Illuminate\Http\Response
*/
public function index()
{
$products = Product::all();
return view('products')->with('products', $products);
}
/**
* Show the form for creating a new resource.
*
* #return \Illuminate\Http\Response
*/
public function create()
{
return view('createprod');
}
/**
* Store a newly created resource in storage.
*
* #param \Illuminate\Http\Request $request
* #return \Illuminate\Http\Response
*/
public function store(Request $request)
{
$input=$request->all();
$images=array();
if($files=$request->file('images')){
foreach($files as $file){
$name=$file->getClientOriginalName();
$file->move('storage/image',$name);
$images[]=$name;
}
}
/*Insert your data*/
Product::insert( [
'images'=> implode("|",$images),
'title' =>$input['title'],
//you can put other insertion here
]);
return redirect('/products');
}
/**
* Display the specified resource.
*
* #param int $id
* #return \Illuminate\Http\Response
*/
public function show($id)
{
$product = Product::find($id);
return view('productshow')->with('product', $product);
}
/**
* Show the form for editing the specified resource.
*
* #param int $id
* #return \Illuminate\Http\Response
*/
public function edit($id)
{
//
}
/**
* Update the specified resource in storage.
*
* #param \Illuminate\Http\Request $request
* #param int $id
* #return \Illuminate\Http\Response
*/
public function update(Request $request, $id)
{
//
}
/**
* Remove the specified resource from storage.
*
* #param int $id
* #return \Illuminate\Http\Response
*/
public function destroy($id)
{
//
}
}
And this is my products.blade.php:
#extends('layouts.app')
#section('content')
<div class="container">
<div class="row justify-content-center">
<div class="col-md-8">
<div class="card">
<div class="card-header">All products
New product +</div>
<hr>
<div class="card-body">
#foreach($products as $product)
<h2>{{$product->title}}</h2>
#foreach (explode('|', $product->images) as $image)
<br>
<a class="image-popup-vertical-fit" href="/storage/image/{{$image}}">
<img src="/storage/image/{{$image}}" style="width:100%">
</a>
#endforeach
<br>
<hr style="border: 1.5px solid grey">
#endforeach
<small><?php echo now() ?></small>
</div>
</div>
</div>
</div>
</div>
#endsection
So in my products.blade.php all images are showing(explode) but I only need to show one image, for example first image. How can I do that? I'm not so good at multiple images. Please help! Thanks!
As you said you just wanted to display a first image from set.
In your products.blade.php instead of #foreach use -
#php $img = explode('|', $product->images); #endphp
Remove -
#foreach (explode('|', $product->images) as $image)
<br>
<a class="image-popup-vertical-fit" href="/storage/image/{{$image}}">
<img src="/storage/image/{{$image}}" style="width:100%">
</a>
#endforeach
And add
<img src="/storage/image/{{$img[0]}}" style="width:100%">
{{ explode('|', $product->images)[0] }}
However, I'd recommend taking a look at Laravel's ORM HasMany relationship when you have time.
It looks like you are saving multiple images in one column?
That's not good approach. make a new model of product images with product as foreign key and save images there and get using Relationship.
** For Now ** you can do this
#foreach($products as $product)
<h2>{{$product->title}}</h2>
<?php
$allImages=explode('|', $product->images)
?>
<br>
<a class="image-popup-vertical-fit" href="/storage/image/{{$allImages[0]->images}}">
<img src="/storage/image/{{$allImages[0]->images}}" style="width:100%">
</a>
<br>
<hr style="border: 1.5px solid grey">
#endforeach
after converting to array, get first index [0] of array instead of looping it.

Problem displaying the data from my 'artists' table with Laravel

I do not manage to display the data from my database (I'm working with Laragon).
I already tried to change some names (variables etc.) here and there but I can't find where come from the problem.
I was able to display nothing first so I needed to change:
resources\views\artist\index.php -> resources\views\artists\index.blade.php
I probalby need to change more things in the code but I don't know where.
VIEW (views\artists\index.blade.php)
#extends('layouts.app')
#section('title', 'Liste des artistes')
#section('content')
<h1>Liste des {{ $resource }}</h1>
<table>
<thead>
<tr>
<th>Firstname</th>
<th>Lastname</th>
</tr>
</thead>
<tbody>
#foreach($artists as $artist)
<tr>
<td>{{ $artist->firstname }}</td>
<td>{{ $artist->lastname }}</td>
</tr>
#endforeach
</tbody>
</table>
#endsection
ROUTES (routes\web.php)
<?php
Route::get('/', function () {
return view('welcome');
});
Route::get('artists', 'ArtistController#index');
CONTROLLER (Controllers\ArtistController.php)
<?php
namespace App\Http\Controllers;
use App\Artist;
use Illuminate\Http\Request;
class ArtistController extends Controller
{
/**
* Display a listing of the resource.
*
* #return \Illuminate\Http\Response
*/
public function index()
{
/*
Take the artist from the db
and send it to a specific template
*/
$artists = Artist::all();
return view('artists.index',
[
'artists' => $artists,
'resource' => 'artistes',
]);
}
/**
* Show the form for creating a new resource.
*
* #return \Illuminate\Http\Response
*/
public function create()
{
//
}
/**
* Store a newly created resource in storage.
*
* #param \Illuminate\Http\Request $request
* #return \Illuminate\Http\Response
*/
public function store(Request $request)
{
//
}
/**
* Display the specified resource.
*
* #param \App\Artist $artist
* #return \Illuminate\Http\Response
*/
public function show(Artist $artist)
{
//
}
/**
* Show the form for editing the specified resource.
*
* #param \App\Artist $artist
* #return \Illuminate\Http\Response
*/
public function edit(Artist $artist)
{
//
}
/**
* Update the specified resource in storage.
*
* #param \Illuminate\Http\Request $request
* #param \App\Artist $artist
* #return \Illuminate\Http\Response
*/
public function update(Request $request, Artist $artist)
{
//
}
/**
* Remove the specified resource from storage.
*
* #param \App\Artist $artist
* #return \Illuminate\Http\Response
*/
public function destroy(Artist $artist)
{
//
}
}
DATABASE (database\ArtistsTableSeeder.php)
<?php
use Illuminate\Database\Seeder;
class ArtistsTableSeeder extends Seeder
{
/**
* Run the database seeds.
*
* #return void
*/
public function run()
{
$artists = [
['firstname'=>'Bob','lastname'=>'Sull'],
['firstname'=>'Marc','lastname'=>'Flynn'],
['firstname'=>'Fred','lastname'=>'Durand'],
];
foreach ($artists as $a) {
DB::table('artists')->insert([
'firstname' => $a['firstname'],
'lastname' => $a['lastname'],
]);
}
}
}
The only thing who get displayed on my browser when I go to 127.0.0.1:8000/artists is:
**Liste des Artistes**
Firstname Lastname
But nothing from the content of my Artistes table is displayed.
Thank you very much guys, the problems was that I needed to change the names of my columns...
FirstName LastName to Firstname Lastname
The data get displayed properly now.

Categories