Laravel 关系和外键约束

Posted

技术标签:

【中文标题】Laravel 关系和外键约束【英文标题】:Laravel Relations and Foreign Key Constraints 【发布时间】:2019-03-27 07:35:37 【问题描述】:

我有两个模型和迁移表。

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Room extends Model

    public function guest()
    
        return $this->hasOne(Guest::class);
    

-

namespace App;

use Illuminate\Database\Eloquent\Model;

class Guest extends Model

    public function room()
    
        return $this->hasMany(Room::class);
    

房间 -> id,平方米,guest_id

guest -> id、Name、last_name、email、电话、room_id(必填)

Room hasOne Guest -> 在模型中实现

Guest hasMany Rooms -> 在模型中实现

如果我创建一个客人,我必须添加一个房间号。 room_table 中对应 id 的房间应该会自动更新成 guest_id。

示例 new Guest: id(2), Name, last_name, phone, email, room_id(3) -> id 为 3 的房间应该显示给 id 为 2 的 Guest。

我该如何实现?

【问题讨论】:

你能分享你所有相关的模型吗 你到底想完成什么? 如果我的理解是正确的,一个房间一次只能住一位客人,一位客人可以同时预订多间客房? @Mysteryos 是正确的 @ShaielndraGupta 我有两个模型:房间 -> id、平方米、guest_id guest -> id、Name、last_name、email、phone、room_id(required) Room hasOne Guest -> 在模型中实现 Guest hasMany Rooms -> 在模型中实现 【参考方案1】:

在您的控制器中添加此功能:

public function CheckInUser($guest_id,$room_id)

 $guest = Guest::where('id',$guest_id)->firstOrFail();
 $room = Room::where('id',$room_id)->firstOrFail();

 $guest['room_id'] = $room_id;
 $guest->save();

 $room['guest_id'] = $guest_id;
 $room->save();


现在您可以随时调用上面的函数来更改客人的房间,如下所示:

CheckInUser(2,3);

【讨论】:

我必须在迁移表中添加任何外键约束吗?如果我这样做会有什么好处? 您无需在客人和房间之间建立任何关系即可使用上述功能。因此不需要外键。 虽然代码可以工作,但最好使用内置的 eloquent 方法来保存您的关系。这符合您的实现类必须不知道模型的列名的关注点的分离【参考方案2】:

房间类

class Room extends \Illuminate\Database\Eloquent\Model 
    /**
     * @var string
     */
    protected $table = 'room';

    /**
     * Relationship - Belongs To - Guest
     *
     * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
     */
    public function guest()
    
        return $this->belongsTo(Guest::class,'guest_id');
    

来宾班

class Guest extends \Illuminate\Database\Eloquent\Model 
    /**
     * @var string
     */
    protected $table='guest';

    /**
     * Relationship - Has Many - Rooms
     *
     * @return \Illuminate\Database\Eloquent\Relations\HasMany
     */
    public function rooms()
    
        return $this->hasMany(Room::class,'guest_id');
    

用于保存上面定义的关系的代码:

$room = Room::create();
$room->save();

$guest = Guest::create();
$guest->save();
//Add guest to room - 1st method
$guest->rooms()->save($room);

//Add guest to room - 2nd method
$room->guest()->associate($guest);

【讨论】:

【参考方案3】:

模特嘉宾

namespace App;

use Illuminate\Database\Eloquent\Model;

class Guest extends Model

    public function room()
    
        return $this->hasMany(Room::class);
    

房间模型

namespace App;

use Illuminate\Database\Eloquent\Model;

class Room extends Model

    public function guest()
    
        return $this->hasOne(Guest::class);
    

在你的控制器中加载所有模型在构造函数中

 $gust_id=$request->get('guest_id');
 $room_id=$request->get('count_of_rooms');
 $squrmtr=$request->get('squaremeters');

让你保存客人数据后你有多个房间,你必须保存它

for($i = 0; $i < count($request->get('count_of_rooms')); $i++)

    $rooms[] = new Room([
        'guset_id'  => $guest->id,
        'squaremeters' => $squrmtr[$i],
    ]);

$guest->room()->saveMany($rooms);

【讨论】:

以上是关于Laravel 关系和外键约束的主要内容,如果未能解决你的问题,请参考以下文章

3.啥是键、候选键、主键和外键?

sqlserver外键关系有啥用?

SQL中啥叫主键,啥是外键,有啥关系

oracle中外键的作用

sql。两个间的外键约束和插入数据问题

Laravel“外键约束失败”