首页 > 解决方案 > 如何直接在对象上附加关系?

问题描述

我不知道我是否正确地提出了这个问题,但无论如何。

因此,当我在控制器上使用“store”方法时,我会在同一个请求中发送两个字段“name”和“fr”。在我的控制器中,我希望能够创建我的模型(房间)并将其关系附加到它(房间翻译)。当我尝试以下代码时,它告诉我我没有提供 room_id。有没有自动的方法来实现这一点?

    public function store(RoomRequest $request)
    {
        $request = $request->validated();
        $room = new Room;
        $room->create($request);
        $room->translations()->create($request);
        return success('');
    }
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class RoomTranslation extends Model
{
    protected $fillable = ['fr', 'room_id'];

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

<?php

namespace App;

use Illuminate\Http\Request;
use Illuminate\Database\Eloquent\Model;
use App\RoomTranslation;

class Room extends Model
{

    protected $fillable = ['name'];

    public function categories() {
        return $this->hasMany('App\Category');
    }

    public function translations() {
        return $this->hasOne('App\RoomTranslation');
    }
}

谢谢您的帮助 !

PS:如果有更简洁的方法来编写我的这部分代码,我将很高兴听到我如何改进它。

谢谢 !

标签: phplaravel

解决方案


你可以这样做:

Room::create($request->only(['name']))->translations()->create($request->only(['fr']));

只需查找拼写错误或输入名称是否正确。

同样在 Room 模型类翻译关系中,如果每个 Room 有多种语言应该是hasMany,如果每个 Room 没有很多翻译,则可以添加翻译语言列。


推荐阅读