天道酬勤,学无止境

使用同步在 Laravel 中的数据透视表中分离(Using sync to detach in pivot table in Laravel)

问题

我有一些奇怪的事情发生,我无法理解,想知道是否有人可以帮助我弄清楚发生了什么。

我有 2 个表(评估员、流程)和一个数据透视表 (process_assessor)。 我正在尝试使用评估员的流程更新数据透视表,因此我有一个表单,提交时将传递给此方法...

public function updateProcesses( $id )
{
    $assessor = $this->model->find( $id );
    return $assessor->processes()->sync( $this->request->get( 'process_id' ) );
}

这工作正常,但是当更新用户没有进程时,我收到一条错误消息......

Argument 1 passed to Illuminate\Database\Eloquent\Relations\BelongsToMany::formatSyncList() must be of the type array, null given, called

但是,(这是奇怪的一点)我还有一个用户配置文件模块,它使用完全相同的方式与数据透视表“同步”,但是当我提交该表单时,未选中该特定模块的所有选项,然后它就可以工作了,用户在枢轴中与它们分离。

我究竟做错了什么? 有任何想法吗?

回答1

简单地转换为一个数组:

return $assessor->processes()->sync( (array) $this->request->get('process_id') );

或者,您可以使用空数组作为get()的默认值:

return $assessor->processes()->sync( $this->request->get('process_id', []) );

然而,第一个选项更可靠。

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Laravel保存/更新多对多关系(Laravel save / update many to many relationship)
    问题 有人可以帮助我如何挽救多对多关系吗? 我有任务,用户可以有许多任务,任务可以有许多用户(很多),我想要实现的是在更新表单中admin可以将多个用户分配给特定任务。 这是通过html多重选择输入来完成的 name="taskParticipants[]" 这里要注意的是,通过相同的表单(输入),您可以添加/删除用户,这就是为什么我必须使用sync()的原因。 也许我应该从头开始,但不知道从哪里开始... 这是我的用户模型: public function tasks() { return $this->belongsToMany('Task','user_tasks'); } 任务模型 public function taskParticipants() { return $this->belongsToMany('User','user_tasks'); } TaskController public function update($task_id) { if (Input::has('taskParticipants')) { foreach(Input::get('taskParticipants') as $worker) { $task2 = $task->taskParticipants->toArray(); $task2 = array_add($task2
  • 雄辩的附加/分离/同步触发任何事件?(Eloquent attach/detach/sync fires any event?)
    问题 我有一个laravel项目,在保存模型并将数据附加到模型后,我需要立即进行一些计算。 调用附加(或分离/同步)后,laravel中是否触发了任何事件? 回答1 解决问题的步骤: 创建自定义的BelongsToMany关系在BelongsToMany自定义关系中,覆盖附加,分离,同步和updateExistingPivot方法在重写的方法中调度所需的事件。 覆盖Model中的belongsToMany()方法并返回您的自定义关系而非默认关系 就是这样。 我创建了已经做到这一点的软件包:https://github.com/fico7489/laravel-pivot 回答2 不,Eloquent中没有关联事件。 但是您可以自己轻松地做到这一点(例如,给出Ticket belongsToMany Component关系): // Ticket model use App\Events\Relations\Attached; use App\Events\Relations\Detached; use App\Events\Relations\Syncing; // ... public function syncComponents($ids, $detaching = true) { static::$dispatcher->fire(new Syncing($this,
  • Laravel雄辩的ORM-多对多删除剩余的数据透视表值(Laravel Eloquent ORM - Many to Many Delete Pivot Table Values left over)
    问题 使用Laravel,我有以下代码 $review = Review::find(1); $review->delete(); Review与Product实体定义了多对多关系。 当我删除评论时,我希望它会与数据透视表中的关联产品分离,但事实并非如此。 当我运行上面的代码时,我仍然在数据透视表中看到链接行。 我是否错过了这里的东西,或者Laravel是这样工作的? 我知道detach()方法,但是我认为删除实体也会自动将其与任何相关实体分离。 Review的定义如下: <?php class Review extends Eloquent { public function products() { return $this->belongsToMany('Product'); } } Product的定义如下: <?php class Product extends Eloquent { public function reviews() { return $this->belongsToMany('Review'); } } 提前致谢。 回答1 detach方法用于从数据透视表中释放关系,而delete方法将删除模型记录本身,即评论表中的记录。 我的理解是删除不会隐式触发分离。 不过,您可以使用模型事件来触发数据透视表的清理,例如: Review::deleting
  • Laravel,sync()-如何同步数组并传递其他数据透视字段?(Laravel, sync() - how to sync an array and also pass additional pivot fields?)
    问题 Laravel官方文档在sync()函数中具有以下功能: $user->roles()->sync( array( 1, 2, 3 ) ); 您还可以将其他数据透视表值与给定的ID相关联: $user->roles()->sync( array( 1 => array( 'expires' => true ) ) ); 在后一个示例中,仅添加了一个枢轴行。 我不明白的是,如果要同步多行,如何关联其他数据透视表记录? 提前致谢。 回答1 这对我有用 foreach ($photos_array as $photo) { //collect all inserted record IDs $photo_id_array[$photo->id] = ['type' => 'Offence']; } //Insert into offence_photo table $offence->photos()->sync($photo_id_array, false);//dont delete old entries = false 回答2 为了sync多个模型以及自定义数据透视表,您需要执行以下操作: $user->roles()->sync([ 1 => ['expires' => true], 2 => ['expires' => false], ... ]); IE。 sync(
  • Laravel Eloquent-附加与同步(Laravel Eloquent - Attach vs Sync)
    问题 Laravel 4的口才ORM中的attach()和sync()之间有什么区别? 我试图环顾四周,但找不到任何东西! 回答1 附(): 处理多对多关系时插入相关模型预期没有数组参数 例子: $user = User::find(1); $user->roles()->attach(1); 同步(): 与attach()方法类似, sync()方法用于附加相关模型。 但是,主要区别在于: sync()接受一组ID放置在数据透视表上其次,最重要的是,如果模型不存在于数组中,则sync方法将从数据透视表中删除数据,并仅将新项插入数据透视表中。 例子: user_role id user_id role_id 1 12 1 2 12 5 3 12 2 $user = User::find(12); $user->roles()->sync(array(1, 2, 3)); 上面的操作将删除: id user_id role_id 2 12 5 并将role_id 3插入表中。 user_role表 id user_id role_id 1 12 1 3 12 2 4 12 3 回答2 为了使其更简单: attach功能仅将记录添加到数据透视表。 sync功能将当前记录替换为新记录。 这对于更新模型非常有用。 例子: 假设您创建了一个帖子,上面贴有许多标签,标签ID为[1,2,3] 。
  • Laravel 数据透视表上的访问器(Getter)和修改器(Setter)(Accessors (Getter) & Mutators (Setter) On a Pivot Table in Laravel)
    问题 我有一个将用户连接到工作区的数据透视表。 在数据透视表上,我还有一个角色列,它定义了该工作区的用户角色。 我可以为数据透视表中的角色提供访问器(Getter)和修改器(Setter)方法吗? 我一直在尝试查看所有内容,但有关 eloquent 数据透视表的详细信息非常稀少。 我不确定是否必须设置自定义枢轴模型? 如果我这样做,一个例子会很棒,因为关于枢轴模型的文档非常基础。 谢谢。 回答1 如果您需要做的只是访问数据透视表上的其他字段,则只需在关系定义上使用withPivot()方法: class User extends Model { public function workspaces() { return $this->belongsToMany('App\Models\Workspace')->withPivot('role'); } } class Workspace extends Model { public function users() { return $this->belongsToMany('App\Models\User')->withPivot('role'); } } 现在您的角色字段将在数据透视表中可用: $user = User::first(); // get data foreach($user->workspaces as
  • 防止Laravel将多个记录添加到数据透视表(Preventing Laravel adding multiple records to a pivot table)
    问题 我已经建立并工作了很多对很多关系,可以将商品添加到我使用的购物车中: $cart->items()->attach($item); 这会向数据透视表中添加一个项目(应如此),但是如果用户再次单击链接以添加他们已经添加的项目,则它会在数据透视表中创建一个重复的条目。 是否有一种内置的方式可以将记录添加到数据透视表中,除非该记录尚不存在? 如果没有,如何检查数据透视表以查找是否已存在匹配的记录? 回答1 您可以通过编写一个非常简单的条件(如下所示)来检查现有记录的存在: if (! $cart->items->contains($newItem->id)) { $cart->items()->save($newItem); } 或/并且您可以在数据库中添加唯一性条件,这将在尝试保存doublet的过程中引发异常。 您还应该看看下面来自Barryvdh的更直接的答案。 回答2 您也可以使用$model->sync(array $ids, $detaching = true)方法并禁用分离(第二个参数)。 $cart->items()->sync([$item->id], false); 更新:从Laravel 5.3或5.2.44开始,您还可以调用syncWithoutDetaching: $cart->items()->syncWithoutDetaching([$item-
  • 获取额外的数据透视表列laravel的值(getting the value of an extra pivot table column laravel)
    问题 我有一个phone_models,phone_problems和一个phone_model_phone_problem数据透视表。 数据透视表有一个额外的“价格”列。 手机型号: class PhoneModel extends \Eloquent { public function problems() { return $this->belongsToMany('RL\Phones\Entities\PhoneProblem')->withPivot('price'); } } 电话问题: class PhoneProblem extends \Eloquent { public function models() { return $this->belongsToMany('PhoneModel')->withPivot('price'); } } 我想做的是获取具有特定问题的特定手机的价格。 这就是我现在的方式,但是我觉得Laravel具有内置的Eloquent功能,我找不到用更简单的方式做到这一点: $model = $this->phoneService->getModelFromSlug($model_slug); $problem = $this->phoneService->getProblemFromSlug($problem_slug)
  • 冬眠中分离的,持久的和短暂的对象是什么?(What are detached, persistent and transient objects in hibernate?)
    问题 冬眠中分离的,持久的和短暂的对象是什么? 请举例说明。 回答1 与Session无关的持久类的new实例,在数据库中没有任何表示,并且Hibernate认为没有标识符值是瞬态的: Person person = new Person(); person.setName("Foobar"); // person is in a transient state 持久实例在数据库中具有表示形式,标识符值,并且与Session关联。 您可以通过将临时实例与Session关联来使其持久化: Long id = (Long) session.save(person); // person is now in a persistent state 现在,如果我们close Hibernate Session ,则持久实例将变为分离实例:它不再附加到Session (但是仍然可以修改,但是稍后再附加到新的Session )。 在整个第10章中,所有这些内容都得到了清晰的解释。使用Hibernate文档的对象,上面只是我的解释。 绝对是必读的。 回答2 休眠中的对象具有以下状态: 瞬态-使用new运算符实例化的对象称为瞬态对象。 如果对象只是使用new运算符实例化的,则该对象是瞬态的,并且该对象未与Hibernate Session关联。 它在数据库中没有持久性表示形式,也没有分配标识符值。
  • Laravel 5:通过数据透视同步额外的字段(Laravel 5: syncing an extra field via pivot)
    问题 用户模型: public function positions() { return $this->belongsToMany('App\Position')->withPivot('company_id')->withTimestamps(); } 职位模型: public function users() { return $this->belongsToMany('App\User')->withPivot('company_id')->withTimestamps(); } 在表单提交时,我有两个数组: $allPositionIds array:3 [ 0 => 98 1 => 99 2 => 100 ] $allCompanyIds array:3 [ 0 => 129 1 => 130 2 => 131 ] 使用 $user->positions()->sync($allPositionIds); 可以按预期将position_user表与用户和相应的位置ID同步。 但是我不知道如何填充多余的字段(“ company_id”) 这是我期望的工作方式: $user->positions()->sync([$allPositionIds => ['company_id' => $allCompanyIds]], false); 我已经阅读了手册
  • Laravel雄辩地无法使用复合主键保存模型(Laravel Eloquent CANNOT Save Models with Composite Primary Keys)
    问题 定义复合主键然后在实例模型上调用save时,将引发异常。 ErrorException (E_UNKNOWN) PDO::lastInsertId() expects parameter 1 to be string, array given 错误发生在第32行 $id = $query->getConnection()->getPdo()->lastInsertId($sequence); 这是Model的声明 class ActivityAttendance extends Eloquent { /** * The database table used by the model. * * @var string */ protected $table = 'activity_attendance'; /** * The primary key of the table. * * @var string */ protected $primaryKey = array('activity_id', 'username'); /** * The attributes of the model. * * @var array */ protected $guarded = array('activity_id', 'username', 'guests'); /** *
  • Eloquent 关系同步也会删除吗?(Does Eloquent relation sync also remove?)
    问题 更新模型并同步关系时,如果我没有传入所有已存在的 id,是否会删除该关系? 回答1 您决定: sync有第二个参数,默认为true并负责分离: $model->relationship()->sync([1,2,3]); $model->relationship()->sync([4,5,6]); // attached [4,5,6], detached [1,2,3] $model->relationship()->getRelatedIds(); // [4,5,6] // but: $model->relationship()->sync([4,5,6], false); // attached [4,5,6], detached [] $model->relationship()->getRelatedIds(); // [1,2,3,4,5,6] 回答2 答案是肯定的。 我找不到任何实际上说明这一点的文件。 假设您有 2 个表:“authors”和“books”,以及一个数据透视表“book_authors”。 创建新作者时: $author_id =2; $author->books()->sync(array(1,4,5,15)); 现在您在数据透视表“book_authors”中有 4 个条目: author_id book_id 2 1 2 4 2 5 2
  • 如何转换雄辩的数据透视参数?(How To Cast Eloquent Pivot Parameters?)
    问题 我有以下具有关系的口才模型: class Lead extends Model { public function contacts() { return $this->belongsToMany('App\Contact') ->withPivot('is_primary'); } } class Contact extends Model { public function leads() { return $this->belongsToMany('App\Lead') ->withPivot('is_primary'); } } 数据透视表包含一个附加参数( is_primary ),该参数将关系标记为主要参数。 目前,当我查询联系人时,我看到这样的回报: { "id": 565, "leads": [ { "id": 349, "pivot": { "contact_id": "565", "lead_id": "349", "is_primary": "0" } } ] } 有没有一种方法可以将is_primary转换为布尔值? 我试过将其添加到两个模型的$casts数组中,但这并没有改变任何内容。 回答1 由于这是数据透视表上的属性,因此使用$casts属性在Lead或Contact模型上均无效。 但是,您可以尝试的一件事是使用定义了
  • 如何找出实体是否在 JPA/Hibernate 中分离?(How to find out whether an entity is detached in JPA / Hibernate?)
    问题 有没有办法查询 JPA EntityManager是否已分离给定实体? 这个 SO 帖子正在讨论一个类似的问题,但没有指出一种在实体的分离状态上查询 JPA EntityManager的方法。 我更喜欢 JPA 方式,否则 Hibernate 特定。 回答1 要检查给定实体是否由当前PersistenceContext管理,您可以使用 EntityManager#contains(Object entity)。 回答2 Piotr Nowicki 的回答提供了一种确定实体是否被管理的方法。 要查明实体是否已分离,我们需要知道它以前是否被管理过(即来自数据库,例如通过持久化或从find操作中获得)。 Hibernate 不提供“实体状态历史”,所以简短的回答是没有 100% 可靠的方法来做到这一点,但在大多数情况下,以下解决方法应该足够了: public boolean isDetached(Entity entity) { return entity.id != null // must not be transient && !em.contains(entity) // must not be managed now && em.find(Entity.class, entity.id) != null; // must not have been removed }
  • 从容器中分离而不停止容器的正确方法(Correct way to detach from a container without stopping it)
    问题 在Docker 1.1.2(最新)中,从容器中分离而不停止它的正确方法是什么? 因此,例如,如果我尝试: docker run -i -t foo /bin/bash或 docker attach foo (用于已经运行的容器) 两者都将我带到集装箱中的码头,如何在不停止的情况下退出集装箱的码头? exit和CTR+C都会停止容器。 回答1 更新:如以下答案Ctrl + p所述, Ctrl + q现在将交互方式转换为守护程序方式。 Ctrl + C (或Ctrl + \ )应该可以将您从容器中分离出来,但是由于您的主要进程是bash,因此它将杀死该容器。 关于Docker的一些课程。 该容器不是真正的功能齐全的操作系统。 运行容器时,启动的过程将使用PID 1并假定具有初始化电源。 因此,当该进程终止时,守护进程将停止容器,直到启动新进程(通过docker start)为止(有关此事的更多说明,http://phusion.github.io/baseimage-docker/#intro) 如果您想要一个始终以分离模式运行的容器,我建议您使用 docker run -d foo 在容器上装有ssh服务器。 (最简单的方法是遵循dockerizing openssh教程https://docs.docker.com/engine/examples/running_ssh
  • 使用附加数据在 Laravel 中创建多对多关系(Creating a Many-to-many relationship in Laravel with additional data)
    问题 我的数据库中有一个存储额外信息的数据透视表。 它有 2 个外键和一个附加字段。 这是它的样子: EventTeam int event_id (fk) int team_id (fk) boolean home 这里的意图是一个事件可能有很多团队(实际上,它必须至少有 2 个,但这不是数据库限制),并且一个团队可以参与许多事件。 但是,对于每个赛事-团队关系,我还想跟踪该团队是否被视为该赛事的主队。 考虑到这一点,我如何定义我的模型? 我是否有一个 EventTeam 模型,或者我belongsToMany在 Team 和 Event 模型中都定义了一个belongsToMany关系? 如果我需要一个单独的模型,我在其中定义了哪些关系? 如果不这样做,如何将布尔字段添加到使用的数据透视表中? 我真的不知道该怎么做。 回答1 您本身不需要 EventTeam 模型,但它可能对播种者有用,或者如果您要将模型附加到您应用程序中任何其他位置的 EventTeam 连接。 这应该有效: 事件模型: public function teams() { return $this->belongsToMany('Team'); } 团队模式: public function events() { return $this->belongsToMany('Event'); } 对于额外的布尔值
  • Laravel Eloquent - 使用数据透视表的 id 作为另一个表中的外键(Laravel Eloquent - Using pivot table's id as a foreign key in another table)
    问题 我需要使用数据透视表的 id 作为另一个表中的外键。 例如我有以下表格: users: id, username, ... places: id, placename, lat, lng, ... place_user: id, user_id, place_id routes: place_user_id, lat, lng, inserted_at. 所以当用户说我要去那个地方时,我在 place_user 表中有一个新条目并开始记录他到达那里的路线。 所以对于每个 place_user 条目,我在路由表中有很多条目。 使用 eloquent 建立这种关系的正确方法是什么? 我应该为数据透视表创建一个模型吗? 我试图通过以下解决方案解决我的问题,但没有运气:https://github.com/laravel/framework/issues/2093#issuecomment-39154456 并在那里发表评论 https://github.com/laravel/framework /issues/2093#issuecomment-58187802 任何建议将不胜感激。 回答1 经过大量搜索和尝试不同的解决方案后,我想出了以下解决方案: 用户模型: class User extends \Eloquent { public function places() {
  • laravel4更新数据透视表中的其他列(laravel4 update additional columns in pivot table)
    问题 我正在尝试以多对多关系更新数据透视表中的其他列数据。 我有两个表-保留表和与数据透视表链接的资源。 我可以附加并正在使用该模型。 但是,我正在努力更新数据透视表中的其他列之一。 我有一个对象:'$ reservation'从该对象中,我使用以下方法创建了另一个对象$ resources: $resources = $reservation->resource()->get(); 然后,我使用foreach循环遍历$resources ,如下所示 foreach($resources as $resource ) {...} 然后,我想更新一个名为gcal_id的列,并使用以下内容: $resource->pivot->gcal_id = "TEST"; $resource->save(); 如果我使用var_dump模型,则可以看到该属性以正确的值存在,但是在数据库本身中该条目没有被更新-因此保存无法正常工作 我在关系的两边都列出了与此相关的列: ->withPivot('start', 'end', 'quantity', 'product_id','gcal_id') 给定我有资源对象后,如何正确更新数据透视表中的列并将其保存到数据库? 谢谢 回答1 之后,在枢轴上设置属性: $resource->pivot->gcal_id = "TEST"; 您似乎可以节省资源
  • 如何在代码中分离LocalDB(SQL Server Express)文件(How to detach a LocalDB (SQL Server Express) file in code)
    问题 在部署中使用LocalDB .mdf文件时,您通常需要移动,删除或备份数据库文件。 首先分离此文件非常重要,因为仅删除它会导致错误,因为LocalDB仍会保留该文件的注册。 那么,如何在代码中分离LocalDB .mdf文件呢? 回答1 我有同样的问题,正在考虑如何处理。 有两种方法。 (1)在使用数据库的末尾(或过程中)分离 我在LinqToSQL中找不到关闭连接的方法,但实际上并不需要。 只需执行以下代码: var db = @"c:\blablabla\database1.mdf"; using (var master = new DataContext(@"Data Source=(LocalDB)\v11.0;Initial Catalog=master;Integrated Security=True")) { master.ExecuteCommand(@"ALTER DATABASE [{0}] SET OFFLINE WITH ROLLBACK IMMEDIATE", db); master.ExecuteCommand(@"exec sp_detach_db '{0}'", db); } 并确保以后不会尝试查询db (否则您将再次连接它)。 (2)出发时分离 在与db建立任何连接之前,分离非常简单: var db = @"c:\blablabla
  • 在中间表上进行软删除以实现多对多关系(Soft delete on a intermediate table for many-to-many relationship)
    问题 如何在连接两种不同类型实体的中间表上设置软删除? 我添加了delete_at列,但是文档说我需要将其放入模型中: protected $softDelete = true; 当然,我没有中间表的模型。 任何想法? 回答1 您可以对急切负载施加约束: public function groups() { return $this ->belongsToMany('Group') ->whereNull('group_user.deleted_at') // Table `group_user` has column `deleted_at` ->withTimestamps(); // Table `group_user` has columns: `created_at`, `updated_at` } 而不是HARD使用以下方法删除关系: User::find(1)->groups()->detach(); 您应该使用类似这样的方式来SOFT删除: DB::table('group_user') ->where('user_id', $user_id) ->where('group_id', $group_id) ->update(array('deleted_at' => DB::raw('NOW()'))); 回答2