Bonjour,

Voila je rencontre un petit problème avec mon code.
Je fais un petit système de réservation pour des terrains de sports.
Je vois mes tables comme ceci :

<a target="_blank" href="http://www.hostingpics.net" title="Hebergeur d'image"><img src="http://img11.hostingpics.net/pics/196771DataBase.jpg" border="0" alt="Hebergeur d'image" /></a>

Concrètement,

  • un terrain peut avoir zéro ou plusieurs réservations
  • une réservation est lier à un terrain et à un utilisateur
  • un utilisateur peut avoir plusieurs réservations

Afin de rentrer les informations,
J'envoie en AJAX les différentes informations comme ceci :

        $('#btnBook').on('click', function(){
            var CSRF_TOKEN = $('meta[name="csrf_token"]').attr('content');
            var dataFieldID = [];
            var dataDate = [];
            $('.selected').each(function () {
                dataFieldID.push($(this).data('field'));
                dataDate.push($(this).data('date') + ' '  + $(this).text() + ':00');
            })
            $.ajax({
                url: './reservation/booking',
                type: 'POST',
                data: {field_id : dataFieldID, start_booking : dataDate, _token: CSRF_TOKEN},
                success: function (xhr) {

                },
                error: function()
                {

                }
            });
        })
    })

BookingController :

      class BookingsController extends Controller
      {
          protected $user;
          protected $booking;

          public function __construct()
          {
              $this->user = Auth::user();
              $this->booking = new Booking();
          }

          public function store(BookingsRequest $request)
          {
              $data = $request->only('user_id', 'field_id', 'start_booking');
              $data['user_id'] = $this->user->id;
              $this->booking->create($data);
          }
      }

Mon model Booking:

      class Booking extends Model
      {

          protected $fillable = ['start_booking', 'field_id' , 'user_id'];

          public function sport_fields(){
              return $this->belongsTo('App\Sport_fields');
          }
          public function users(){
              return $this->belongsTo('App\User');
          }
      }

Premièrement voici l'erreur que j'obtiens :

QueryException in Connection.php line 673:
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'field_id' in 'where clause' (SQL: select count(*) as aggregate from sport_fields where field_id in (2))

Apparemment, c'est à cause de ma requête ajax où le data n'est pas appelé ID mais field_id.

Mais si je change ça , voici l'erreur

ErrorException in helpers.php line 748:
preg_replace(): Parameter mismatch, pattern is a string while replacement is an array
in helpers.php line 748
at HandleExceptions->handleError('2', 'preg_replace(): Parameter mismatch, pattern is a string while replacement is an array', 'G:\XAMP\xampp\htdocs\badTFE\vendor\laravel\framework\src\Illuminate\Support\helpers.php', '748', array('search' => '\?', 'replace' => array('1', array('2'), array('30/05/2016'), '2016-06-01 19:24:35', '2016-06-01 19:24:35'), 'subject' => 'insert into bookings (user_id, field_id, start_booking, updated_at, created_at) values (1, ?, ?, ?, ?)', 'value' => array('2')))

De plus on peut remarquer qu'il cherche à rentrer un timestamp updated_at, created_at alors qu'ils n'existent pas dans ma table.

Ma table Booking :

      public function up()
          {
              Schema::create('bookings', function (Blueprint $table) {
                  $table->increments('id');
                  $table->integer('user_id')->unsigned()->index();
                  $table->integer('field_id')->unsigned()->index();
                  $table->timestamp('start_booking');
                  $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
                  $table->foreign('field_id')->references('id')->on('sport_fields')->onDelete('cascade');
              });
          }

Si quelqu'un voit le problème, ça m'aiderait beaucoup, je galère un peu débuger tout ça ...

Merci d'avance

4 réponses


AlexJM
Réponse acceptée

Column not found: 1054 Unknown column 'field_id' in 'where clause' (SQL: select count(*) as aggregate from sport_fields where field_id in (2))

C'est parce qu'il ne trouve pas le champ field_id dans la table bookings

Pour le created_at et updated_at, tu dois ajouter :
public $timestamps = false;
dans ton modèle

Bon j'ai pas les ID très clair ce matin mais si ça peu t'aider

// Model User
    public function booking() {
        return $this->belongsToMany('SportField', 'booking', 'user_id', 'field_id')->withPivot('start_booking')->withTimestamps();
    }
// Model SportField
    public function booking() {
        return $this->belongsToMany('User', 'booking', 'field_id', 'user_id')->withPivot('start_booking')->withTimestamps();
    }
 // Controller
    public function store(Request $request) {
        $user = User::find($request->input('user_id'));
        $user->booking()->attach($request->input('field_id'), ['start_booking' => input('start_booking')]);
    }
 // Migration create_booking_table
 ...
 $table->timestamps();
 ...

J'utilise toujours les created_at et updated_at je ne me suis jamais demandé comment les enlever mais fait attention avec une relation mayToMany il ne fait pas appel au model pivot donc si tu les enleve dans le model pivot tu auras surement une erreur
J'espere t'avoir aider ++

Au passage j'ai pas pris la peine de lire ton code en entier donc check les noms des variables, table,... avant de tester

NKIS7
Auteur

Merci à vous pour vos réponses, j'ai trouvé la solution.
Dans un premier temps , effectivement lorsqu'on ne veut pas s'amuser avec les created_at et updated_at , il faut préciser dans le model qu'on ne l'utilise pas "public $timestamps = false" et secondo ma relation était mal faite d'où certains messages d'erreurs.