繁体   English   中英

在Laravel中将值返回null

[英]Return values to null in laravel

我工作的电子商务项目,Laravel 5.5凡在我的产品表我有2列命名discountdiscount_date ,我要的是当列日discount_date谈到双方discountdiscount_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();

我建议将discountdiscount_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列都自动变为空。

回答:

有几种解决方法:

我将把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_atupdated_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();

这种方法的优点是:

  • 您可以跟踪折扣的历史记录
  • 易于维护,减少了“任务计划程序”的麻烦。
  • 可供程序员阅读。

这种方法的缺点是:

  • 如果有两个有效折扣,您可能会大跌眼镜。 但是我不认为我们可以将datetime用作主键 ..如果它们重叠起来意味着一个跨越10月10日至10月15日,另一个跨越10月11日至10月14日,该怎么办? 有趣的不是吗。 也许那里的DBA可以建议减少代码麻烦的方法? 每次要在交易中添加新折扣时,都可以通过检查折扣表来解决此问题。

您的下一个问题:

好! 现在甚至更加令人困惑:))),我将我的控制器包括在内,请现在查看我拥有哪些字段以及应将代码放在何处。 欣赏它。

下一个答案:

我们不知道该折扣将在哪里使用。.我想它将在您的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM