首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用枢轴表添加belongsToMany和hasMany关系的新记录?

问如何使用枢轴表添加belongsToMany和hasMany关系的新记录?
EN

Stack Overflow用户
提问于 2017-12-25 11:20:16
回答 1查看 46关注 0票数 1

我只是用belongsToMany机房建立了Room模型,用hasMany资产关系建立了Room模型。我还创建了一个支点表,用于存储房间和资产的ids。

MODELS

代码语言:javascript
复制
class Asset extends Model
{

    protected $fillable = [ 'name', 'slug', 'price' ];

    public function room()
    {
        return $this->belongsToMany('App\Room');
    }
}

class Room extends Model {

    protected $fillable = [ 'number', 'status' ];

    public function assets()        
    { 
        $this->hasMany('App\Asset'); }
    }
}

MIGRATIONS

代码语言:javascript
复制
public function up()
    {
        Schema::create('assets', function (Blueprint $table)
        {
            $table->increments('id');
            $table->string('name')->unique();
            $table->string('slug');
            $table->string('price');

            $table->timestamps();
            $table->softDeletes();
        });
    }

 public function up()
    {
        Schema::create('asset_room', function(Blueprint $table) {
            $table->integer('asset_id')->unsigned();
            $table->foreign('asset_id')->references('id')->on('assets');
            $table->integer('room_id')->unsigned();
            $table->foreign('room_id')->references('id')->on('rooms');
            $table->unique(['asset_id', 'room_id']);
            $table->timestamps();
        });
    }

我通过php artisan tinker添加了一个资产如下:

代码语言:javascript
复制
$asset = new App\Asset;
$asset->name = "Lamp";
$asset->slug = "lamp";
$asset->price = 40;
$asset->save();

现在,我如何在房间中添加一个资产,以便它也能在枢轴表中添加一个条目?

代码语言:javascript
复制
$room = new App\Room;
$room->number = 1;
$room->status = 1;
$room->asset...?
$room->save();

UPDATE

根据Alexey的建议,我在Room模式中更新了以下函数,因为它是belongsToMany而不是hasMany关系。

代码语言:javascript
复制
public function assets()        
{ 
    $this->belongsToMany('App\Asset');
}

我用id 1创建了一个资产。当试图将资产附加到房间时,如下所示:

代码语言:javascript
复制
$room->assets()->attach(1);

我得到以下错误:

PHP致命错误:在第1行的C:\xampp\htdocs\hotel\vendor\psy\psysh\src\Psy\ExecutionLoop‌​\Loop.php(90):eval()d代码中调用null上的成员函数附件()

这也破坏了Tinker mode (Psy Shell)的执行。

EN

回答 1

Stack Overflow用户

发布于 2017-12-25 11:25:18

首先,因为这是一种多对多的关系,所以应该是belongsToMany()

代码语言:javascript
复制
public function assets()        
{ 
    return $this->belongsToMany('App\Asset');
}

若要将资产附加到房间,请使用attach()方法:

代码语言:javascript
复制
$asset = new App\Asset;
$asset->name = "Lamp";
$asset->slug = "lamp";
$asset->price = 40;
$asset->save();

$room = new App\Room;
$room->number = 1;
$room->status = 1;
$room->save();

$room->assets()->attach($asset->id);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47968122

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档