[英]Return values to null in laravel
我工作的电子商务项目,Laravel 5.5凡在我的产品表我有2列命名discount
和discount_date
,我要的是当列日discount_date
谈到双方discount
和discount_date
列空自动成为。
我怎样才能做到这一点?
更新:
产品控制器:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Product;
use App\Subcategory;
use App\Category;
use App\Attribute;
use Carbon\Carbon;
use App\User;
use Auth;
use DB;
use Storage;
use Spatie\Permission\Models\Role;
use Spatie\Permission\Models\Permission;
use jpmurray\LaravelCountdown\Countdown;
class ProductController extends Controller
{
public function __construct() {
$this->middleware(['auth', 'isAdmin']);
}
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
$products = Product::orderby('id', 'desc')->get();
return view('admin.products.index', compact('products'));
}
public function show($slug)
{
$product = Product::where('slug', $slug)->firstOrFail();
$countdown = DB::table('products')->where('discount_date', '!=', null)->pluck('discount_date');
$now = Carbon::now();
return view('admin.products.show', compact('product', 'countdown', 'now'));
}
public function create()
{
$categories = Category::all();
$subcategories = Subcategory::all();
$attributes = Attribute::all();
$user = Auth::user();
return view('admin.products.create', compact('user', 'categories', 'subcategories', 'attributes'));
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
//Validating title and body field
$this->validate($request, array(
'title'=>'required|max:225',
'slug' =>'required|max:255|unique:products',
'user_id' =>'required|numeric',
'image_one' =>'nullable|image',
'image_two' =>'nullable|image',
'image_three' =>'nullable|image',
'image_four' =>'nullable|image',
'short_description' => 'nullable|max:1000',
'description' => 'required|max:100000',
'subcategory_id' => 'required|numeric',
'discount' => 'nullable|numeric',
'discount_date' => 'nullable|date',
'price' => 'required|numeric',
));
$product = new Product;
$product->title = $request->input('title');
$product->slug = $request->input('slug');
$product->user_id = $request->input('user_id');
$product->description = $request->input('description');
$product->short_description = $request->input('short_description');
$product->subcategory_id = $request->input('subcategory_id');
$product->discount = $request->input('discount');
$product->discount_date = $request->input('discount_date');
$product->price = $request->input('price');
if ($request->hasFile('image_one')) {
$image = $request->file('image_one');
$filename = 'product' . '-' . time() . '.' . $image->getClientOriginalExtension();
$location = public_path('images/');
$request->file('image_one')->move($location, $filename);
$product->image = $filename;
}
$product->save();
$product->attributes()->sync($request->attributes, false);
//Display a successful message upon save
Session::flash('flash_message', 'Product, '. $product->title.' created');
return redirect()->route('admin.products.index');
}
/**
* Show the form for editing the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function edit($id)
{
$product = Product::find($id);
$categories = Category::all();
$users = User::all();
$subcategories = Subcategory::all();
$attributes = Attribute::all();
$attributes2 = array();
foreach($attributes as $attribute) {
$attributes2[$attribute->id] = $attribute->title;
}
return view('admin.products.edit', compact('product', 'categories', 'users', 'subcategories', 'attributes2'));
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, $id)
{
$product = Product::find($id);
if ($request->input('slug') == $product->slug) {
$this->validate($request, array(
'title'=>'required|max:225',
'description' =>'required|min:4|max:100000',
'short_description' =>'nullable|min:4|max:1000',
'image_one' =>'sometimes|image',
'image_two' =>'sometimes|image',
'image_three' =>'sometimes|image',
'image_four' =>'sometimes|image',
'discount' =>'nullable|numeric',
'discount_date' =>'nullable|date',
'user_id' =>'required|numeric',
'price' =>'required|numeric',
'subcategory_id' => 'sometimes|integer',
));
} else {
// validate the date
$this->validate($request, array(
'slug' =>'required|max:225|unique:products',
'title'=>'required|max:225',
'description' =>'required|min:4|max:100000',
'short_description' =>'nullable|min:4|max:1000',
'image_one' =>'sometimes|image',
'image_two' =>'sometimes|image',
'image_three' =>'sometimes|image',
'image_four' =>'sometimes|image',
'discount' =>'nullable|numeric',
'discount_date' =>'nullable|date',
'user_id' =>'required|numeric',
'price' =>'required|numeric',
'subcategory_id' => 'sometimes|integer',
));
}
$product = Product::where('id',$id)->first();
$product->title = $request->input('title');
$product->description = $request->input('description');
$product->slug = $request->input('slug');
$product->user_id = $request->input('user_id');
$product->short_description = $request->input('short_description');
$product->image_one = $request->input('image_one');
$product->image_two = $request->input('image_two');
$product->image_three = $request->input('image_three');
$product->image_four = $request->input('image_four');
$product->discount = $request->input('discount');
$product->discount_date = $request->input('discount_date');
$product->price = $request->input('price');
$product->subcategory_id = $request->input('subcategory_id');
if ($request->hasFile('image_one')) {
$image = $request->file('image_one');
$filename = 'product' . '-' . time() . '.' . $image->getClientOriginalExtension();
$location = public_path('images/');
$request->file('image_one')->move($location, $filename);
$oldFilename = $product->image_one;
$product->image_one = $filename;
Storage::delete($oldFilename);
}
$product->save();
$product->attributes()->sync($request->attributes);
return redirect()->route('products.index',
$product->id)->with('flash_message',
'Product, '. $product->title.' updated');
}
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy($id)
{
$product = Product::findOrFail($id);
$product->attributes()->detach();
Storage::delete($product->image);
$product->delete();
return redirect()->route('products.index')
->with('flash_message',
'Product successfully deleted');
}
}
更新2 Product model
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Product extends Model
{
protected $table = 'products';
protected $fillable = [
'title', 'slug', 'image_one', 'image_two', 'image_three', 'image_four', 'short_description', 'description', 'price', 'discount', 'discount_date',
];
public function category(){
return $this->belongsTo(Category::class);
}
public function subcategory(){
return $this->belongsTo(Subcategory::class);
}
public function attributes()
{
return $this->belongsToMany(Attribute::class, 'product_attributes', 'product_id', 'attribute_id');
}
public function order(){
return $this->hasMany(Order::class);
}
public function discounts(){
return $this->hasMany(Discount::class, 'product_id', 'id');
}
}
基于Bagus Tesa
Update 3答案:
现在我有折扣表,一切都设置好了,这是我的discountcontroller
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Discount;
use App\Product;
class DiscountController extends Controller
{
public function __construct() {
$this->middleware(['auth', 'isAdmin']);
}
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
$discounts = Discount::orderby('id', 'desc')->get();
$products = Product::all();
return view('admin.discounts.index', compact('discounts', 'products'));
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
//Validating title and body field
$this->validate($request, array(
'amount'=>'required|max:225',
'valid_from' =>'required|date',
'valid_to' =>'required|date',
'product_id' => 'required|numeric',
));
$discount = new Discount;
$discount->amount = $request->input('amount');
$discount->valid_from = $request->input('valid_from');
$discount->valid_to = $request->input('valid_to');
$discount->product_id = $request->input('product_id');
$discount->save();
}
/**
* 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)
{
//
}
}
这是我的discount model
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Discount extends Model
{
protected $table = 'discounts';
protected $fillable = ['valid_from', 'valid_to', 'amount', 'product_id',];
public function products(){
return $this->belongsTo(Product::class, 'product_id', 'id');
}
public function scopeValid($query){
return $query->whereDate('valid_from', '>=', Carbon::today()->toDateString())
->whereDate('valid_to', '<=', Carbon::today()->toDateString());
}
}
更新4:
现在一切正常,除了结束折扣时间,这是所有这些更改之前的问题。
如您在屏幕快照中看到的,到期时间仍未到,但是折扣状态已到期。
这是我在刀片中使用的代码:
@if ($product->$discounts > $mytime)
OK!
@else
Expired!
@endif
这是在我的控制器中:
$count = $product->discounts()->valid()->get();
$discounts = Discount::where('product_id', '=', $product->id)->get();
$mytime = Carbon::now();
我建议将discount
和discount_date
提取到自己的表中,例如
discounts (
datetime valid_from,
datetime valid_to,
int product_id,
decimal amount
)
然后只查找在给定日期和产品下有效的折扣,例如
SELECT product_id, amount
FROM discounts
WHERE product_id = 42
AND (NOW() BETWEEN valid_from AND valid_to);
尽管这需要额外的查询或联接以获取折扣,但在自己的表中维护折扣更容易。 您不需要删除过期的折扣,因为BETWEEN查询可确保您仅获得当前时间有效的折扣。
同样,通过这种方式,您可以保留折扣的历史记录。 清空列时您会失去的东西。 即使您想删除它们,也将更加容易,因为您可以删除所有折扣,其中NOW() > valid_to
。
不幸的是,我不知道如何用Laravel / Eloquent做到这一点。 但这更多的是关于数据库建模的,而不是特定的框架。 您的框架应该允许这样做。 我相信它确实可以做到。 但是我不知道如何。
注意:我从脑海中键入了代码片段。 您想仔细检查他们的语法
我正在使用Laravel 5.5进行电子商务项目,其中在我的产品表中有2列分别命名为Discount和Discount_date,我想要的是当Discount_date列的日期到来时Discount和Discount_date列都自动变为空。
有几种解决方法:
Products
时检查 折扣列并使其无效 。 我将把Gordon的方法扩展为Laravel的方法,因为它具有保留较早折扣的功能。
高登(Gordon)解释说,该表看起来像下面的样子。
discounts (
int id,
datetime valid_from,
datetime valid_to,
int product_id,
decimal amount,
datetime created_at,
datetime updated_at
)
注意:为了遵循Laravel的约定,表的结构略有更改( created_at
和updated_at
;为了清楚起见,还添加了主键。
要创建这样的表,您可以自己触发查询,也可以使用Laravel的Migration 。 我将不介绍数据库的创建,因为不清楚是直接使用MySQL / MariaDB还是帮助PhpMyAdmin,还是您自己利用Laravel迁移。 假设您已经准备好名为discounts
的表,我们将必须在Laravel中添加一个新模型:
<?php
namespace App;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\Model;
class Discount extends Model
{
protected $table = 'discounts';
protected $dates = ['valid_from', 'valid_to'];
public function products(){
return $this->belongsTo(Product::class, 'product_id', 'id');
}
public function scopeValid($query){
return $query->where('valid_from', '>=', Carbon::now()->toDateTimeString())
->where('valid_to', '<', Carbon::now()->toDateTimeString());
}
}
您将需要添加具有以下关系的Product
模型:
public function discounts(){
return $this->hasMany(Discount::class, 'product_id', 'id');
}
注意scopeValid($query)
,这是我们对有效折扣进行过滤的快捷方式-您可以在文档中查看Laravel Scopes 。 ->whereDate
是在Laravel中查询日期时间字段的特定功能 ,您可以在Laravel Diary中找到一些示例。 这样,您可以使用以下雄辩的查询来过滤Product
的折扣,以获取折扣:
Product::find(1)->discounts()->valid()->get();
好! 现在甚至更加令人困惑:))),我将我的控制器包括在内,请现在查看我拥有哪些字段以及应将代码放在何处。 欣赏它。
我们不知道该折扣将在哪里使用。.我想它将在您的show($slug)
视图( admin.products.show
)或计算总价时显示。是程序员(我想是DBA),而不是魔术师。
编辑:愚蠢的我忘记了Carbon::today()
只给您今天的日期,而toDateString()
只给您日期部分。 因此,时间参考应为Carbon::now()->toDateTimeString()
。
编辑:错误的查询,应该在where
根据日期和时间进行过滤。
如果您确实想将值设置为null,则可以使用MySQL Event Scheduler
但是我认为这是一种将select语句修改为类似以下内容的简便方法:
select
id,
IF(discount_date > now(), discount,null) as discount,
IF(discount_date > now(), discount_date,null) as discount_date
from product
您可以在rextester.com上进行测试
在laravel中应该是这样的:
$products = Product::orderby('id', 'desc')->select('all','your','columns', 'IF(discount_date > now(), discount,null) as discount', 'IF(discount_date > now(), discount_date,null) as discount_date')->get();
和
$countdown = DB::table('products')->where('discount_date', '>', 'now()')->pluck('discount_date');
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.