【问题标题】:Adding key-value to Laravel result object/collection将键值添加到 Laravel 结果对象/集合
【发布时间】:2020-12-22 01:35:57
【问题描述】:

Laravel 新手。有什么看起来应该不是问题,但却引起了头痛。

我正在尝试在返回的结果对象/集合中插入一个键值对 (bookingRef),这样结果将是:

[{"class_id":7,"class_name":"beginner","class_slots_avail":100,"class_slots_booked":53,"class_date":"2020-12-07 21:47:23","class_time":"09:25:00","class_reg_price":350, bookingRef: 127}]

我尝试过 push、put 和 merge 等方法,它们会在对象返回后插入键值对,但这不是我需要的。

这是我的控制器:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Models\Booking;

use App\Http\Controllers\Auth;

use Illuminate\Support\Facades\Mail;

use DB;

class BookingsController extends Controller
{
    //
    function store(Request $request) {

        $id = $request->input('class');
        
        if(DB::table('classes')->where('class_id', '=', $id)->exists()) {

            if(DB::table('classes')->where('class_id', '=', $id)->value('class_slots_booked') 
            < DB::table('classes')->where('class_id', '=', $id)->value('class_slots_avail')) {
            
                $booking = new Booking();
                
                $booking->class_id = $id;
                $booking->user_id = \Auth::id();
                $booking->save();


                DB::table('classes')->where('class_id', '=', $id)->increment('class_slots_booked', 1);

                if($booking) {


                    $confBook = DB::table('classes')->where('class_id', '=', $id)->get();

                    $confBook->bookingRef = $booking->id;

                    \error_log($confBook);
                }
               
            }
            else return('CLASS FULLY BOOOOKED');
    }
    else return('CLASS NOT Available');
}
}

【问题讨论】:

  • 是否有多个类具有相同的class_id
  • Lagbox。不,只有一个。
  • 正如其他人已删除的评论所说,你可能想要first() 而不是get(),所以你会得到一条记录而不是它们的集合
  • 如果你有 classes 表的模型可能会更容易
  • 抱歉。我应该澄清一下 - 我正在使用 get() 以便我可以在视图中使用 foreach 循环,该循环将用于单个和多个结果。如果有办法使用 first() 将值放入结果中,我很乐意只创建两个视图。

标签: laravel collections model insert


【解决方案1】:

您可以减少查询,并通过一些调整来放置这些额外的数据:

function store(Request $request)
{
    $id = $rquest->input('class');

    $class = DB::table('classes')->where('class_id', $id)->first();

    if ($class) {
        if ($class->class_slots_booked < $class->class_slots_avail) {
            $booking = new Booking();
            $booking->class_id = $id;
            $booking->user_id = $request->auth()->id;

            if ($booking->save()) {
                // adding the extra data
                $class->bookingRef = $booking->id;

                DB::table('classes')->where('class_id', $id)
                    ->increment('class_slots_booked', 1);

                $class->class_slots_booked++;

                return view('view-booking', [
                    'bookings' => collect($class),
                ]);
            }
            // booking did not save
        }
        // unavailable
    }
    // class not found
}

使用classes 表的模型会更方便一些,而且与 Booking 的关系设置也会是一个加分项。

【讨论】:

  • 恐怕没有用。不过,感谢您的帮助。
  • @monkeytrick 没用怎么办?
  • @monkeytrick 酷,你是怎么解决的?
  • lagbox,我几乎复制了你的代码,除了使用模型(也是你的建议)而不是数据库。您要编辑以反映这一点,然后我会选择它作为接受的答案吗?
【解决方案2】:

感谢 Lagbox 使用模型的建议,我设法解决了:

   <?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Models\Booking;
use App\Models\Classes;

use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Mail;

class BookingsController extends Controller
{
    //
    function store(Request $request) {

        $id = $request->input('class');
        
        $class = Classes::where('class_id', $id)->first();

        if($class) {

            if($class->class_slots_booked < $class->class_slots_avail) {

                 $booking = new Booking();
                
                 $booking->class_id = $id;
                 $booking->user_id = Auth::id();

                 if($booking->save()){

                    $class->where('class_id', $id)->increment('class_slots_booked');
                    $class->bookingRef = $booking->id;

                    return view('view-booking', ['bookings' => $class]);

                 }              
            }
            else return('Class Fully Booked');           

        }
        else return('Class Not Available');

    }
};

据我所知,get() 方法返回一个包含对象的数组,这就是 object->new_property = value 不起作用的原因。然而, first() 方法似乎返回一个对象,这就是它会返回的原因。 看来我有一些关于模型和集合的阅读。

【讨论】:

  • 您可以致电$class-&gt;increment('class_slots_booked'),因为您使用的是模型
  • 似乎只是使用模型的相同代码
  • langox,是的。请参阅我之前的评论以接受您的回答。
猜你喜欢
  • 2020-09-05
  • 2020-09-04
  • 2014-12-09
  • 1970-01-01
  • 1970-01-01
  • 2019-05-28
  • 1970-01-01
  • 2020-04-11
相关资源
最近更新 更多