【问题标题】:Insert data in pivot table Controller Laravel 8在数据透视表控制器 Laravel 8 中插入数据
【发布时间】:2021-08-15 13:13:51
【问题描述】:

我有两个具有多对多关系的表:

  • courriers
  • structures
  • courrier_structure

数据透视表包含:

  • id
  • courrier_id
  • structure_id
  • valide

valide 是一个布尔属性。

在第一种情况下,我通过表单插入了 courrier_idstructure_id。接下来,我希望在用户单击按钮时将 1 放入 valide 值中,并且我想通过控制器执行此操作。

我的模型如下所示:

class Courrier extends Model {
    public function structures()
    {
        return $this->belongsToMany(Structure::class)->withTimestamps()
            ->withPivot('valide');
    }
}
class Structure extends Model
{
    use HasFactory;

    protected $fillable = [
        'nom_structure',
    ];
    
    public function courriers(){

        return $this->belongsToMany(Courrier::class)->withTimestamps()
            ->withPivot('valide');
    }
}

我的网络路线

Route::get('{id}/valider', [App\Http\Controllers\CourrierController::class, 'valider'])
    ->name('valider');

我对刀片的看法:

@foreach($courriers as $key => $courrier)
<td>
    <a class='' onclick='return confirm("Êtes-vous sûr de vouloir valider la réception de ce courrier?")' href="{{ route('valider',$courrier->id) }}"> 
        Valider 
    </a>
</td>
@endforeach

我收到此错误的控制器:

未定义的属性: Illuminate\Database\Eloquent\Relations\BelongsToMany::$id

public function valider( Request $rquest, Courrier $courrier) {
    $courrier->structures()->updateExistingPivot($courrier->structures()->id,
        [$request->valide = 1]
    );
    return redirect()->route('nvCourriersDMO');
}

我正在研究结构 ID=1 的字段,

public function nvCourriersDMO(Request $request, Courrier $courrier)
    {
                     
        $courriers = Courrier::join('courrier_structure', 'courriers.id',         
    '=', 'courrier_structure.courrier_id')- 
   >where('courrier_structure.structure_id','=','1')- 
   >where('courrier_structure.valide','=',NULL)->get();
         
                
        return view("nvCourriersDMO", compact('courriers'));
    }

【问题讨论】:

  • 您可以将错误消息添加到您的问题中吗?
  • @shaedrich 是的,它完成了
  • 要从关系中获取属性,不要使用括号:$courrier-&gt;structure-&gt;id。它不是复数 (structures) 吗?
  • @shaedrich 它是复数形式,是的,这只是一个错误现在我收到此错误:此集合实例上不存在属性 [id]。
  • 因为它是belongsToMany。您只需要收藏中的一件吗?

标签: php laravel controller pivot-table laravel-8


【解决方案1】:

Laravel 关系方法有时有点棘手。如果您使用括号调用该方法(就像您在这里一样),它会返回一个“关系类”实例。在这种情况下,BelongsToMany 类的实例。

如果将方法作为属性调用(不带括号),Laravel 会返回关系 target。在本例中是 Structure 模型实例的集合。

这应该可以解决问题:

public function valider(Request $request, Courrier $courrier)
{
    $pivotIds = $courrier->structures()->allRelatedIds();

    $courrier->structures()->updateExistingPivot(
        $pivotIds,
        ['valide' => 1]
    );

    return redirect()->route('nvCourriersDMO');
}

【讨论】:

  • 什么都没有改变,它什么也没做,你看到我的刀片视图和网络路由了吗?
  • $pivotIds = $courier->structures()->allRelatedIds();提供所有字段,在我的情况下,如果您看到正在谈论的内容,我希望仅验证一个字段
  • $pivotIds 应该包含您给定的Courrier 与其相关的structures 之间的所有枢轴ID。 updateExistingPivot 方法更新每个数据透视记录。这就是你想要做的吗?
  • 只有一个 pivotId 因为我已经在我的控制器中完成了这个: >where('courier_structure.structure_id','=','1')->where('courier_structure.valide','=',NULL)->get();
  • 您在问题中没有提到这一点。我认为你需要澄清你目前在做什么,以及你想要实现什么。
猜你喜欢
  • 2014-08-24
  • 2020-10-21
  • 1970-01-01
  • 2020-09-19
  • 1970-01-01
  • 2023-02-01
  • 2018-06-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多