尝试阅读属性“标题”在null上
我知道问题是什么,但我无法解决。当我创建具有以下代码的类别时,没问题。但是,当我尝试创建产品时,它不会更新category_id,因此我每次都会遇到此错误。两个控制器的代码相同(产品使用类别控制器的函数)
我的productController.php
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\Category;
use App\Models\Product;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
class ProductController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
//
$data = Product::all();
return view('admin.product.index', [
'data' => $data
]);
}
/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create()
{
$data = Category::all();
return view('admin.product.create', [
'data' => $data
]);
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
$data = new Product();
$data->category_id = $request->category_id;
$data->user_id = 0; // $request->user_id;
$data->title = $request->title;
$data->keywords = $request->keywords;
$data->description = $request->description;
$data->detail = $request->detail;
$data->price = $request->price;
$data->months = $request->months;
$data->status = $request->status;
if ($request -> file('image')){
$data-> image = $request->file('image') -> store('public/images');
}
$data->save();
return redirect('admin/product');
}
/**
* Display the specified resource.
*
* @param \App\Models\Product $product
* @return \Illuminate\Http\Response
*/
public function show(Product $product,$id)
{
//
$data = Product::find($id);
return view('admin.product.show', [
'data' => $data
]);
}
/**
* Show the form for editing the specified resource.
*
* @param \App\Models\Product $product
* @return \Illuminate\Http\Response
*/
public function edit(Product $product, $id)
{
//
$data = Product::find($id);
$datalist = Category::all();
return view('admin.product.edit', [
'data' => $data,
'datalist' => $datalist
]);
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param \App\Models\Product $product
* @return \Illuminate\Http\Response
*/
public function update(Request $request, Product $product, $id)
{
//
$data = Product::find($id);
$data->category_id = $request->category_id;
$data->user_id = 0; // $request->user_id;
$data->title = $request->title;
$data->keywords = $request->keywords;
$data->description = $request->description;
$data->detail = $request->detail;
$data->price = $request->price;
$data->months = $request->months;
$data->status = $request->status;
if ($request -> file('image')){
$data-> image = $request->file('image') -> store('public/images');
}
$data->save();
return redirect('admin/product');
}
/**
* Remove the specified resource from storage.
*
* @param \App\Models\Product $product
* @return \Illuminate\Http\Response
*/
public function destroy(Product $product, $id)
{
//
$data = Product::find($id);
if ($data->image){
Storage::delete($data->image);
}
$data->delete();
return redirect('admin/product');
}
}
my categorycontroller.php
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\Category;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
class CategoryController extends Controller
{
protected $appends = [
'getParentsTree'
];
public static function getParentsTree ($category, $title){
if ($category->parent_id == 1)
{
return $title;
}
$parent = Category::find($category->parent_id);
$title = $parent->title.' > '. $title;
return CategoryController::getParentsTree ($parent, $title);
}
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
//
$data = Category::all();
return view('admin.category.index', [
'data' => $data
]);
}
/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create()
{
$data = Category::all();
return view('admin.category.create', [
'data' => $data
]);
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
$data = new Category;
$data->parent_id = $request->parent_id;
$data->title = $request->title;
$data->keywords = $request->keywords;
$data->description = $request->description;
$data->status = $request->status;
if ($request -> file('image')){
$data-> image = $request->file('image') -> store('public/images');
}
$data->save();
return redirect('admin/category');
}
/**
* Display the specified resource.
*
* @param \App\Models\Category $category
* @return \Illuminate\Http\Response
*/
public function show(Category $category,$id)
{
//
$data = Category::find($id);
return view('admin.category.show', [
'data' => $data
]);
}
/**
* Show the form for editing the specified resource.
*
* @param \App\Models\Category $category
* @return \Illuminate\Http\Response
*/
public function edit(Category $category, $id)
{
//
$data = Category::find($id);
$datalist = Category::all();
return view('admin.category.edit', [
'data' => $data,
'datalist' => $datalist
]);
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param \App\Models\Category $category
* @return \Illuminate\Http\Response
*/
public function update(Request $request, Category $category, $id)
{
//
$data = Category::find($id);
$data->parent_id = $request->parent_id;
$data->title = $request->title;
$data->keywords = $request->keywords;
$data->description = $request->description;
$data->status = $request->status;
if ($request -> file('image')){
$data-> image = $request->file('image') -> store('public/images');
}
$data->save();
return redirect('admin/category');
}
/**
* Remove the specified resource from storage.
*
* @param \App\Models\Category $category
* @return \Illuminate\Http\Response
*/
public function destroy(Category $category, $id)
{
//
$data = Category::find($id);
if ($data->image){
Storage::delete($data->image);
}
$data->delete();
return redirect('admin/category');
}
}
my create.blade.blade.php of Product
@extends('layouts.adminbase')
@section('title', 'Add Product')
@section('content')
<!-- Begin Page Content -->
<div class="container-fluid">
<!-- Page Heading -->
<h1 class="h3 mb-4 text-gray-800">Add Product</h1>
<!-- Collapsable Card-->
<div class="card shadow mb-4">
<!-- Card Header - Accordion -->
<a href="#collapseCardExample" class="d-block card-header py-3" data-toggle="collapse"
role="button" aria-expanded="true" aria-controls="collapseCardExample">
<h6 class="m-0 font-weight-bold text-primary">Product Elements</h6>
</a>
<!-- Card Content - Collapse -->
<div class="collapse show" id="collapseCardExample">
<div class="card-body">
<form action="{{route('admin_product_store')}}" method="POST" enctype="multipart/form-data">
@csrf
<div class="card-body">
<div class="form-group">
<label >Parent Product</label>
<select class="form-control select2" name="parent_id" >
@foreach ($data as $rs)
<option value="{{ $rs->id }}"> {{ \App\Http\Controllers\Admin\CategoryController::getParentsTree($rs, $rs->title) }}</option>
@endforeach
</select>
</div>
<div class="form-group">
<label for="exampleInputEmail1">Title</label>
<input type="text" class="form-control" name="title" placeholder="Title">
</div>
<div class="form-group">
<label for="exampleInputEmail1">Keywords</label>
<input type="text" class="form-control" name="keywords" placeholder="Keywords">
</div>
<div class="form-group">
<label for="exampleInputEmail1">Description</label>
<input type="text" class="form-control" name="description" placeholder="Description">
</div>
<div class="form-group">
<label for="exampleInputEmail1">Price</label>
<input type="number" class="form-control" name="Price" value="0">
</div>
<div class="form-group">
<label for="exampleInputEmail1">Months</label>
<input type="number" class="form-control" name="Months" value="0">
</div>
<div class="form-group">
<label for="exampleInputEmail1">Detail</label>
<textarea class="form-control" name="detail">
</textarea>
</div>
<div class="form-group">
<label for="exampleInputFile">Image</label>
<div class="input-group">
<div class="custom-file">
<input type="file" class="custom-file-input" name="image">
<label class="custom-file-label" for="exampleInputFile">Choose image file</label>
</div>
</div>
</div>
<div class="form-group">
<label>Status</label>
<select class="custom-select" name="status">
<option>Enabled</option>
<option>Disabled</option>
</select>
</div>
</div>
<!-- /.card-body -->
<div class="card-footer">
<button type="submit" class="btn btn-primary">Save</button>
</div>
</form>
</div>
</div>
</div>
</div>
<!-- /.container-fluid -->
</div>
<!-- End of Main Content -->
@endsection
I know what the problem is but I couldn't solve it. When I'm creating a category with the code below no problem. But when I try to create a product it doesn't updates the category_id so I get this error every time. The code is same for both controllers (product uses category controller's function)
My ProductController.php
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\Category;
use App\Models\Product;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
class ProductController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
//
$data = Product::all();
return view('admin.product.index', [
'data' => $data
]);
}
/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create()
{
$data = Category::all();
return view('admin.product.create', [
'data' => $data
]);
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
$data = new Product();
$data->category_id = $request->category_id;
$data->user_id = 0; // $request->user_id;
$data->title = $request->title;
$data->keywords = $request->keywords;
$data->description = $request->description;
$data->detail = $request->detail;
$data->price = $request->price;
$data->months = $request->months;
$data->status = $request->status;
if ($request -> file('image')){
$data-> image = $request->file('image') -> store('public/images');
}
$data->save();
return redirect('admin/product');
}
/**
* Display the specified resource.
*
* @param \App\Models\Product $product
* @return \Illuminate\Http\Response
*/
public function show(Product $product,$id)
{
//
$data = Product::find($id);
return view('admin.product.show', [
'data' => $data
]);
}
/**
* Show the form for editing the specified resource.
*
* @param \App\Models\Product $product
* @return \Illuminate\Http\Response
*/
public function edit(Product $product, $id)
{
//
$data = Product::find($id);
$datalist = Category::all();
return view('admin.product.edit', [
'data' => $data,
'datalist' => $datalist
]);
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param \App\Models\Product $product
* @return \Illuminate\Http\Response
*/
public function update(Request $request, Product $product, $id)
{
//
$data = Product::find($id);
$data->category_id = $request->category_id;
$data->user_id = 0; // $request->user_id;
$data->title = $request->title;
$data->keywords = $request->keywords;
$data->description = $request->description;
$data->detail = $request->detail;
$data->price = $request->price;
$data->months = $request->months;
$data->status = $request->status;
if ($request -> file('image')){
$data-> image = $request->file('image') -> store('public/images');
}
$data->save();
return redirect('admin/product');
}
/**
* Remove the specified resource from storage.
*
* @param \App\Models\Product $product
* @return \Illuminate\Http\Response
*/
public function destroy(Product $product, $id)
{
//
$data = Product::find($id);
if ($data->image){
Storage::delete($data->image);
}
$data->delete();
return redirect('admin/product');
}
}
My CategoryController.php
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\Category;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
class CategoryController extends Controller
{
protected $appends = [
'getParentsTree'
];
public static function getParentsTree ($category, $title){
if ($category->parent_id == 1)
{
return $title;
}
$parent = Category::find($category->parent_id);
$title = $parent->title.' > '. $title;
return CategoryController::getParentsTree ($parent, $title);
}
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
//
$data = Category::all();
return view('admin.category.index', [
'data' => $data
]);
}
/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create()
{
$data = Category::all();
return view('admin.category.create', [
'data' => $data
]);
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
$data = new Category;
$data->parent_id = $request->parent_id;
$data->title = $request->title;
$data->keywords = $request->keywords;
$data->description = $request->description;
$data->status = $request->status;
if ($request -> file('image')){
$data-> image = $request->file('image') -> store('public/images');
}
$data->save();
return redirect('admin/category');
}
/**
* Display the specified resource.
*
* @param \App\Models\Category $category
* @return \Illuminate\Http\Response
*/
public function show(Category $category,$id)
{
//
$data = Category::find($id);
return view('admin.category.show', [
'data' => $data
]);
}
/**
* Show the form for editing the specified resource.
*
* @param \App\Models\Category $category
* @return \Illuminate\Http\Response
*/
public function edit(Category $category, $id)
{
//
$data = Category::find($id);
$datalist = Category::all();
return view('admin.category.edit', [
'data' => $data,
'datalist' => $datalist
]);
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param \App\Models\Category $category
* @return \Illuminate\Http\Response
*/
public function update(Request $request, Category $category, $id)
{
//
$data = Category::find($id);
$data->parent_id = $request->parent_id;
$data->title = $request->title;
$data->keywords = $request->keywords;
$data->description = $request->description;
$data->status = $request->status;
if ($request -> file('image')){
$data-> image = $request->file('image') -> store('public/images');
}
$data->save();
return redirect('admin/category');
}
/**
* Remove the specified resource from storage.
*
* @param \App\Models\Category $category
* @return \Illuminate\Http\Response
*/
public function destroy(Category $category, $id)
{
//
$data = Category::find($id);
if ($data->image){
Storage::delete($data->image);
}
$data->delete();
return redirect('admin/category');
}
}
My create.blade.php of product
@extends('layouts.adminbase')
@section('title', 'Add Product')
@section('content')
<!-- Begin Page Content -->
<div class="container-fluid">
<!-- Page Heading -->
<h1 class="h3 mb-4 text-gray-800">Add Product</h1>
<!-- Collapsable Card-->
<div class="card shadow mb-4">
<!-- Card Header - Accordion -->
<a href="#collapseCardExample" class="d-block card-header py-3" data-toggle="collapse"
role="button" aria-expanded="true" aria-controls="collapseCardExample">
<h6 class="m-0 font-weight-bold text-primary">Product Elements</h6>
</a>
<!-- Card Content - Collapse -->
<div class="collapse show" id="collapseCardExample">
<div class="card-body">
<form action="{{route('admin_product_store')}}" method="POST" enctype="multipart/form-data">
@csrf
<div class="card-body">
<div class="form-group">
<label >Parent Product</label>
<select class="form-control select2" name="parent_id" >
@foreach ($data as $rs)
<option value="{{ $rs->id }}"> {{ \App\Http\Controllers\Admin\CategoryController::getParentsTree($rs, $rs->title) }}</option>
@endforeach
</select>
</div>
<div class="form-group">
<label for="exampleInputEmail1">Title</label>
<input type="text" class="form-control" name="title" placeholder="Title">
</div>
<div class="form-group">
<label for="exampleInputEmail1">Keywords</label>
<input type="text" class="form-control" name="keywords" placeholder="Keywords">
</div>
<div class="form-group">
<label for="exampleInputEmail1">Description</label>
<input type="text" class="form-control" name="description" placeholder="Description">
</div>
<div class="form-group">
<label for="exampleInputEmail1">Price</label>
<input type="number" class="form-control" name="Price" value="0">
</div>
<div class="form-group">
<label for="exampleInputEmail1">Months</label>
<input type="number" class="form-control" name="Months" value="0">
</div>
<div class="form-group">
<label for="exampleInputEmail1">Detail</label>
<textarea class="form-control" name="detail">
</textarea>
</div>
<div class="form-group">
<label for="exampleInputFile">Image</label>
<div class="input-group">
<div class="custom-file">
<input type="file" class="custom-file-input" name="image">
<label class="custom-file-label" for="exampleInputFile">Choose image file</label>
</div>
</div>
</div>
<div class="form-group">
<label>Status</label>
<select class="custom-select" name="status">
<option>Enabled</option>
<option>Disabled</option>
</select>
</div>
</div>
<!-- /.card-body -->
<div class="card-footer">
<button type="submit" class="btn btn-primary">Save</button>
</div>
</form>
</div>
</div>
</div>
</div>
<!-- /.container-fluid -->
</div>
<!-- End of Main Content -->
@endsection
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
始终在控制器中使用验证,特别是在商店或更新方法中。
通过验证,您可以控制要在服务器端获得哪种数据,并轻松将500个错误(服务器端)更改为400个错误(客户端)。
我强烈建议您在下面的链接中查看有关验证的整个文档:
varrization
laravel 在这种特定情况下,您的问题是您的类别ID,该类别ID在您的类别表中不存在。
我建议您只需在您的cateControler商店方法中使用有关您的category_id的验证,例如:
,请记住在控制器中始终使用验证。
希望对您有帮助。
Always use validation in your controllers ,specially in store or update methods .
With validation , you can control what kind of data you want to get in your server side and easily change 500 errors(server side) to 400 errors(client side) .
I strongly suggest you to see whole laravel docs about validation in link below :
Laravel validation
Beside it , your problem in this specific situation is your send a category id that is not exists in your category table .so when use find function , It returns null .
I suggest you to simply use a validation in your ProductController store method about your category_id , something like :
And remember to always use validation in your controller .
Hope that helps you .