【问题标题】:Storing New Record Through Pivot Table In Laravel在 Laravel 中通过数据透视表存储新记录
【发布时间】:2019-03-20 06:46:00
【问题描述】:

当我从前端提交表单数据时,我正在尝试创建一条新记录,但我正在努力思考如何做到这一点。我已经找了一些例子,但还没有找到一些东西。因此,我正在为新的约定提交数据,并且我的约定与任务共享数据透视表关系。这是关系结构。

  1. 用户有许多任务
  2. 任务属于用户
  3. 客户有很多参与度
  4. 参与度属于客户
  5. Task belongsToMany Engagements(当然反之亦然)

如果我将数据提交到存储一个新的参与,并且我还想同时存储一个新任务我很难理解我应该使用什么方法来完成这个。

我明白在填充数据透视表之前我需要存在参与和任务。

EngagementsController.php(用于存储新的参与)

public function store(Request $request)
{
    $data = $request->validate([
        'client_id' => 'required|integer',
        'return_type' => 'required|string',
        'year' => 'required|string',
        'status' => 'required|string',
        'assigned_to' => 'required|string',
        'done' => 'required|boolean'
    ]);

    $engagement = Engagement::create([
        'client_id' => $request->client_id,
        'return_type' => $request->return_type,
        'year' => $request->year,
        'assigned_to' => $request->assigned_to,
        'status' => $request->status,
        'done' => $request->done,
    ]);

    return response($engagement, 201);
}

在运行$engagement = Engagement 之后,我想知道是否可以像这样将assigned_to 字段的数据同时用于Engagement 和Task?

$engagement = Engagement::create([
    'client_id' => $request->client_id,
    'return_type' => $request->return_type,
    'year' => $request->year,
    'assigned_to' => $request->assigned_to,
    'status' => $request->status,
    'done' => $request->done,
]);

$data = $request->assigned_to;
$task->tasks()->create($data);

参与模式

class Engagement extends Model
{
    protected $fillable =
    [
        'client_id',
        'return_type',
        'year',
        'assigned_to',
        'status',
    ];
    public function client() 
    {
        return $this->belongsTo('App\Client');
    }

    public function tasks()
    {
        return $this->belongsToMany('App\Task', 'engagement_task', 'engagement_id', 'task_id');
    }

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

}

任务模型

class Task extends Model
{
    protected $fillable = ['user_id'];

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

    public function engagements()
    {
        return $this->belongsToMany('App\Engagement', 'engagement_task', 'task_id', 'engagement_id');
    }
}

【问题讨论】:

    标签: laravel eloquent


    【解决方案1】:

    你可以$task = Task::create(['user_id' => $request->get('assigned_to')])。

    接下来您需要attach 参与任务,$engagement->tasks()->attach($task->id);

    顺便说一句,您可以通过验证 form request 中的数据来稍微清理一下您的控制器。

    接下来您可以通过$engagement = Engagement::create($engagementRequest->validated())创建您的参与度

    【讨论】:

    • 感谢@Thijs Bouwes 的帮助,我已经实现了Task::create,我收到了以下警报Integrity constraint violation: 1452 Cannot add or update a child row: 你知道这是什么原因吗?
    • $request->get('assigned_to') 是有效的用户 ID,您的用户表中存在什么?
    • 看来问题是 id 不正确。我现在得到了正确的回应。谢谢你的帮助!
    猜你喜欢
    • 2018-04-08
    • 1970-01-01
    • 2016-05-19
    • 2020-09-01
    • 1970-01-01
    • 2017-06-21
    • 1970-01-01
    • 1970-01-01
    • 2015-04-01
    相关资源
    最近更新 更多