代码之家  ›  专栏  ›  技术社区  ›  monkeytrick

向Laravel结果对象/集合添加键值

  •  0
  • monkeytrick  · 技术社区  · 5 年前

    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');
    }
    }
    
    1 回复  |  直到 5 年前
        1
  •  0
  •   lagbox    5 年前

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

    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
    }
    

    使用Model for the classes 表格和与Booking的关系设置也将是一个加分项。

        2
  •  0
  •   monkeytrick    5 年前

    由于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()方法似乎返回了一个对象,这就是为什么它会起作用。 看来我有一些关于模特和系列的阅读要做。

        3
  •  0
  •   Sejal Varu    3 年前

    在这个例子中,从集合[1,2,3]开始。我们使用map方法为集合中的每个项目添加1。然后,我们使用push方法将新值4添加到集合中。最后,我们使用all方法检索集合的底层数组表示。

    $collection = collect([1, 2, 3]);
    
    $modifiedCollection = $collection->map(function ($item) {
        // Add 1 to each item in the collection
        return $item + 1;
    });
    
    $modifiedCollection->push(4); // Add a new value to the collection
    
    dd($modifiedCollection->all());
    

    输出将是:

    [2, 3, 4, 4]
    
    推荐文章