2017-02-28 12 views
14

Tôi đang sử dụng Backpack for Laravel để cung cấp khu vực phụ trợ của trang web laravel của tôi.Thêm một đến nhiều hình thức - Ba lô laravel

Tôi đang gặp bảng sau trong cấu trúc cơ sở dữ liệu của tôi:

enter image description here

này là thêm bộ để một trận đấu, và thêm trận đấu với một giải đấu.

Đây là những Models tôi:

Tournament mẫu:

<?php 

namespace App\Models; 

use Illuminate\Database\Eloquent\Model; 
use Backpack\CRUD\CrudTrait; 

class Tournament extends Model 
{ 
    use CrudTrait; 

    /* 
    |-------------------------------------------------------------------------- 
    | GLOBAL VARIABLES 
    |-------------------------------------------------------------------------- 
    */ 

    protected $fillable = ['from', 'to', 'type', 'location', 'place']; 

    /* 
    |-------------------------------------------------------------------------- 
    | RELATIONS 
    |-------------------------------------------------------------------------- 
    */ 

    public function matches() 
    { 
     return $this->hasMany('App\Models\Match'); 
    } 
} 

trận đấu mẫu:

<?php 

namespace App\Models; 

use Illuminate\Database\Eloquent\Model; 
use Backpack\CRUD\CrudTrait; 

class Match extends Model 
{ 
    use CrudTrait; 

    /* 
    |-------------------------------------------------------------------------- 
    | GLOBAL VARIABLES 
    |-------------------------------------------------------------------------- 
    */ 

    protected $table = 'matches'; 

    protected $fillable = ['opponent']; 

    /* 
    |-------------------------------------------------------------------------- 
    | RELATIONS 
    |-------------------------------------------------------------------------- 
    */ 

    public function sets() 
    { 
     return $this->hasMany('App\Models\Set'); 
    } 
} 

Đặt mẫu:

<?php 

namespace App\Models; 

use Illuminate\Database\Eloquent\Model; 
use Backpack\CRUD\CrudTrait; 

class Set extends Model 
{ 
    use CrudTrait; 

    /* 
    |-------------------------------------------------------------------------- 
    | GLOBAL VARIABLES 
    |-------------------------------------------------------------------------- 
    */ 

    protected $fillable = ['self', 'opponent', 'index']; 

    public function match() 
    { 
     return $this->belongsTo('App\Models\Match'); 
    } 
} 

Bây giờ tôi muốn làm sau khi tôi tạo ra một giải đấu trong backend:

enter image description here

Tôi đã có thể thiết lập từ, đến, loại, vị trí và địa điểm. Nhưng bây giờ tôi muốn có khả năng thêm một trận đấu và thêm các bộ vào trận đấu đó. Điều này tất cả trên một trang.

Nhưng tôi hơi bị mắc kẹt về cách thực hiện việc này. Ai đó có thể giúp tôi trên đường không?

Trả lời

5

Tôi khuyên bạn nên làm tất cả trong nhiều bước. Tạo một giải đấu, vào xem giải đấu, thêm các trận đấu. Chuyển đến chế độ xem đối sánh, thêm bộ. Wayyyy dễ dàng hơn những gì bạn muốn làm. Nhưng hey, đó là ứng dụng của bạn và bạn muốn làm trong một lần.

Sẽ có một số hạn chế như bạn chỉ có thể gửi một đối sánh tại một thời điểm, để tránh trộn các bộ của bạn. Trừ khi bạn muốn sử dụng javascript và tự động đặt tên cho phù hợp và tập hợp của bạn.

Trong mô hình của bạn (Kết hợp & Đặt) thêm khóa ngoài vào mảng $fillable. Chúng ta có thể cần chúng.

Vì vậy, khi bạn gửi biểu mẫu, bạn tạo các giải đấu

public function save(Request $request) 
{ 
    $tournament = Tournament::create([ 
     ... 
    ]); 

    $match = Match::create([ 
     'tournament_id' => $tournament->id, 
     ... 
    ]); 

    $match->sets()->saveMany([ 
     new Set(['self' => $request->set1_self, ...]), //foreign key auto inserted 
     new Set(['self' => $request->set2_self, ...]), 
     new Set(['self' => $request->set3_self, ...]), 
    ]); 
} 

Điều này có nghĩa trong biểu mẫu, bạn phải đặt tên đầu vào bộ của bạn như

<input name="set1_self"/> 
<input name="set1_opponent"/> 

Và vân vân.

Bây giờ nếu bạn muốn thực hiện nhiều trận đấu cùng một lúc, bạn sẽ phải tìm một cách để đặt tên cho nguyên liệu đầu vào của bạn như

<input name="match1_set1_self" /> 
<input name="match1_set2_self" /> 

Và vân vân.

Vì bạn muốn làm mọi thứ trong một trang. Bạn có thể xây dựng một SPA mini chỉ để thêm các giải đấu, phù hợp với & bộ. Trang sẽ không thay đổi/tải lại.

0

Bạn sẽ cần phải có một phần logic của mình bằng JavaScript. Trong ví dụ của bạn, khi bạn nhấp vào nút 'Thêm một kết hợp khác', bạn sẽ thao tác DOM HTML và nhân đôi hộp 'Thêm so khớp'.

Sau khi điền toàn bộ biểu mẫu, nó sẽ được gửi đến máy chủ.

Máy chủ sau đó cần phải:

  1. Tạo một đối tượng Tournament mới và lưu nó.

  2. Lặp lại các trận đấu đã gửi và tạo đối tượng Đối sánh mới và liên kết chúng với giải đấu đã tạo trước đó. Lặp qua các bộ đã gửi và liên kết chúng với kết quả được tạo.

0

Tôi nghĩ bạn nên thiết kế theo cách mà giải đấu được tạo trước khi biểu mẫu thêm kết hợp/đặt được hiển thị. Nó vẫn còn có thể có tất cả trong một hình thức mặc dù bằng cách áp dụng Ajax hoặc Vue.js, vv

  1. Sau một giải đấu mới được thêm thành công, ẩn các hình thức và hiển thị các thông tin giải đấu mới cùng với sự thêm mới hình thức khớp.

  2. Khi kết quả trùng khớp mới được thêm thành công, hãy xóa biểu mẫu đối sánh mới và tải thông tin đối sánh mới.

Lưu ý: Tôi tự hỏi bạn dự định cho phép đối thủ được thêm vào như thế nào.

Chúc mừng!

2

Được rồi vì vậy tốt nhất là những gì @EddyTheDove đề cập,

$match->sets()->saveMany([ 
    new Set(['self' => $request->set1_self, ...]); 
    new Set(['self' => $request->set2_self, ...]); 
    new Set(['self' => $request->set3_self, ...]); 
]); 

Nhưng nó phải được thực hiện cùng một lúc thông qua Ajax, Và vue.js sẽ còn tuyệt vời. Gọi Ajax để tạo một giải đấu mới, Cùng tìm nạp tất cả các trận đấu trong cùng một cuộc gọi và đính kèm các trận đấu đã chọn, một lần nữa Ajax yêu cầu thêm các trận đấu vào giải đấu được tạo trong cuộc gọi Ajax trước đó.

Gửi thông tin đối sánh trong yêu cầu đến bộ điều khiển qua ajax, Nơi mã trên sẽ lưu. Để có nhiều tập hợp hơn, Nhân đôi tập hợp html nhưng đừng quên tên đầu vào. Cung cấp một số mã mà chúng tôi có thể chơi cùng.

+0

Tuyệt vời, Ngoài ra, vue.js còn có thể làm cho nó đơn giản hơn nhiều. –

Các vấn đề liên quan