Laravel的EloquentORM5.5CheatSheet一对一关联展示详情:在这个展示中,我们有2个模型(Owner和Car)和两个表(owners和cars)。业务逻辑:一个用户可以拥有一辆车。\一辆车可以有一个主人。关联图:关联详细信息:Cars表必须存储OwnerID。雄辩的模型:classOwner{publicfunctioncar(){return$this->hasOne(Car::class);}}classCar{publicfunctionowner(){return$this->belongsTo(Owner::class);}}数据库迁移:Schema::create('owners',function(Blueprint$table){$table->increments('id');$table->string('name');});Schema::create('cars',function(Blueprint$table){$table->increments('id');$table->string('name');$table->integer('owner_id')->unsigned()->index()->nullable();$table->foreign('owner_id')->references('id')->on('owners');});saverecord://BetweenOwnerandCarCreateanassociationbetween$owner->car()->save($car);//建立Car和Owner的关联$car->owner()->associate($owner)->保存();获取记录://GetOwnerCar$owner->car;//GetCarOwner$car->owner;一对多关联示例详情:在这个示例中,我们有两个模型:Thief(小偷)和Car(汽车),以及两个表:thieves和cars。商业规则:小偷可以偷多辆车。汽车只能被小偷偷走。关系图:关系详情:Vehicle表应该存储小偷的ID。雄辩的模型:classThief{publicfunctioncars(){return$this->hasMany(Car::class);}}classCar{publicfunctionthief(){return$this->belongsTo(Thief::class);}}数据迁移:Schema::create('thieves',function(Blueprint$table){$table->increments('id');$table->string('name');});Schema::create('cars',function(Blueprint$table){$table->increments('id');$table->string('name');$table->integer('thief_id')->unsigned()->index()->nullable();$table->foreign('thief_id')->references('id')->on('thieves');});记录存储://创建小偷和汽车之间的连接。$thief->cars()->saveMany([$car1,$car2,]);//或者在单个模型上调用save()方法。$thief->cars()->save($car);//在Car和Thief之间创建关联。$car->thief()->associate($thief)->save();pullrecord://获取小偷偷的车$thief->cars;//获取偷车的小偷$car->thief;多态一对多关系演示细节:在这个演示中,我们有三个模型(男人、女人和汽车)和三个表(男人、女人和汽车)。商业规则:一个人(买家)可以购买多辆汽车。一个女人(买家)可以买很多车。这辆车可以由一个买家(男人或女人)购买。关系图:关系详情:Car表应存储买方ID和买方类型。"buyer"是一个模特姓名数组(男和女),不限于两者,买家类型是模特的实际姓名。雄辩的模型:classMan{publicfunctioncars(){return$this->morphMany(Car::class,'buyer');}}classWoman{publicfunctioncars(){return$this->morphMany(Car::class,'buyer');}}classCar{publicfunctionbuyer(){return$this->morphTo();}}数据库迁移:Schema::create('men',function(Blueprint$table){$table->increments('id');$table->string('name');});Schema::create('women',function(Blueprint$table){$table->increments('id');$table->string('name');});Schema::create('cars',function(Blueprint$table){$table->increments('id');$table->string('name');$table->integer('buyer_id')->unsigned()->index()->nullable();$table->string('buyer_type')->nullable();//或使用$table->morphs('buyer');而不是"buyer_id"和"buyer_type"});storerecords://在买家(男人/女人)和汽车之间建立联系。$man->cars()->saveMany([$car1,$car2,]);$woman->cars()->saveMany([$car1,$car2,]);//或对单个模型使用save()函数。$man->cars()->save($car);$woman->cars()->save($car);//创建汽车和买家(男人/女人)之间的关系。$car1->buyer()->associate($man)->save();$car2->buyer()->associate($woman)->save();检索记录://getbuyer(man)/woman)car$men->cars$women->cars//获取这辆车的买家(man/woman)$car->buyer多对多关联示例展示:在这个例子中,我们有两个Model(Driver和Car),和三个表(drivers,一个名为car_driver的中间关联表)。业务规则:一个司机可以开多辆车。一辆汽车可以由许多司机驾驶。关系图:关联细节:关联表“car_driver”应该包含司机ID和汽车ID。关联模型:classDriver{publicfunctioncars(){return$this->belongsToMany(Car::class);}}classCar{publicfunctiondrivers(){return$this->belongsToMany(Driver::class);}}数据库迁移:Schema::create('drivers',function(Blueprint$table){$table->increments('id');$table->string('name');});Schema::create('cars',function(Blueprint$table){$table->increments('id');$table->string('name');});Schema::create('car_driver',function(Blueprint$表){$table->increments('id');$table->integer('car_id')->unsigned()->index();$table->foreign('car_id')->references('id')->on('cars')->onDelete('cascade');$table->integer('driver_id')->unsigned()->index();$table->foreign('driver_id')->references('id')->on('drivers')->onDelete('cascade');});保存记录://创建Driver和Car之间的关联。$driver->cars()->attach([$car1->id,$car2->id,]);//或者使用sync()函数防止重复关联。$driver->cars()->sync([$car1->id,$car2->id,]);//创建Car和Driver的关联。$car->drivers()->attach([$driver1->id,$driver2->id,]);//或者使用sync()函数防止重复关联。$car->drivers()->sync([$driver1->id,$driver2->id,]);queryrecord://GetDriverCar$driver->cars//GetCarDrivers$car->drivers多对多多态关联展示细节:在这个展示中我们有三个模型(Valet,Owner和Car)和4个表(代客、车主、汽车和司机)。业务逻辑:一个代理司机(driver)可以开多辆车,一个车主(driver)可以开很多车,一辆车可以被多个司机(driverand/orcarowner)开。关联详细信息:应存储中间表“drivers”DriverID、DriverType和VehicleID。驾驶是模型集合(Valet和Owner)的同义词,并不限于两种模型。驱动程序类型是模型的实际名称。Eloquent模型:classValet{publicfunctioncars(){return$this->morphToMany(Car::class,'driver');}}classOwner{publicfunctioncars(){return$this->morphToMany(Car::class,'driver');}}classCar{publicfunctionvalets(){return$this->morphedByMany(Valet::class,'driver');}publicfunctionowners(){return$this->morphedByMany(Owner::class,'driver');}}资料库迁移:Schema::create('valets',function(Blueprint$table){$table->increments('id');$table->string('name');});Schema::创建('owners',函数(蓝图$table){$table->increments('id');$table->string('name');});Schema::create('drivers',函数(蓝图$table){$table->increments('id');$table->integer('driver_id')->unsigned()->index();$table->string('driver_type');//或者使用$table->morphs('driver')来取代「driver_id」和「driver_type」$table->integer('car_id')->unsigned()->index();$table->foreign('car_id')->references('id')->on('cars')->onDelete('cascade');});保存记录://在司机(Valet/Owner)和Car之间创建关联$valet->cars()->saveMany([$car1,$car2]);$owner->cars()->saveMany([$car1,$car2]);//或者使用save()方法保存单个模型$valet->cars()->save($car1);$owner->cars()->save($car1);//建立Car和driver(Valet/Owner)的关联$car->valets()->attach([$valet1->id,$valet2->id,]);$car->owners()->attach([$owner1->id,$owner2->id,]);//或者使用sync()方法避免重复关联$car->valets()->sync([$valet1->id,$代客2->id,]);$car->owners()->sync([$owner1->id,$owner2->id,]);获取记录://Getdriver(Valet/Owner)'sCars$valet->cars$owner->cars//GetCardrivers(ValetandOwner)$car->owners$car->valets更多现代PHP知识,请到Laravel/PHP知识社区
