Laravel:多对多的关系

时间:2015-11-24 13:48:47

标签: php laravel

我有这样的设置。

文档模型

document.getElementById("a211094").removeAttribute("onmouseout");
document.getElementById("a211094").removeAttribute("onmouseover");

板块模型

public function plates()
{
    return $this->belongsToMany('App\Models\Plate')->withTimestamps();
}

和像这样的数据透视表

public function documents()
{
    return $this->belongsToMany('App\Models\Document')->withTimestamps();
}

现在我理解这种关系的多少,这意味着我可以将许多 public function up() { Schema::create('document_plate', function (Blueprint $table) { $table->integer('plate_id')->unsigned()->index(); $table->integer('document_id')->unsigned()->index(); $table->primary(['plate_id', 'document_id']); $table->timestamps(); }); } 个id分配给许多plate id的权利?

这是我一直在玩的东西。

document

我想要的是:当$plates = [ 'plate_id_1' => 1, 'plate_id_2' => 2, 'plate_id_3' => 3, ]; $docs = [ 'recipe_id' => 1, 'procedure_id' => 2, ]; // attach many docs to plates $plate = Plate::findMany($plates); $doc = Document::findMany($docs); $plate->documents()->attach($doc->id); 从下拉列表中选择user时,我希望将这些选定的文档分配给多个选定的广告素材。所以这是很多有很多板块的文档。我已经尝试并检查了文档http://laravel.com/docs/5.1/eloquent-relationships#inserting-related-models

documentssync方法。

上面的代码生成错误

  

调用未定义的方法Illuminate \ Database \ Eloquent \ Collection :: documents()

任何想法我做错了什么?我这样做是对的吗?

1 个答案:

答案 0 :(得分:0)

您正在尝试从整个模型集合中检索模型的关系,这将无法正常工作。我假设你发现很多方法都会根据你传入它的id数组返回一组模型。

如果要将多个印版附加到文档,请使用:

$document->plates()->attach($plate_ids);

如果您想将许多文件附在印版上:

$plates->documents()->attach($document_ids);

编辑:

在不改变代码的情况下,可能有一种更优雅的方式,但您可以执行以下操作:

$plate_filter = [
    'plate_id_1' => 1,
    'plate_id_2' => 2,
    'plate_id_3' => 3,
];


$doc_filter = [
    'recipe_id' => 1,
    'procedure_id' => 2,
];

// attach many docs to plates
$plates =   Plate::findMany($plate_filter);
$docs   =   Document::findMany($doc_filter);

// Loop over the selected plates, attach selected docs
foreach( $plates as $plate ) {

    // $doc_ids = get your document id's here, use lists or something
    $plate->documents()->attach($doc_ids);
}

// Loop over the selected docs, attach selected plates
foreach( $documents as $document ) {

    // You already have your plate id's in your first array,
    // simply use array_values to return a new array containing
    // only the plate id's
    $document->plates()->attach(array_values($plate_filter));
}

如果你可以将一个集合传递给attach(),这是很方便的,我不确定你是否可以,而且我无法找到任何在谷歌上这样做的人的引用。