2014-08-27 37 views
0

我有我的數據庫中的以下結構的Laravel 4透視表:實現使用雄辯

-shared_resources表 標籤都有效表 -shared_resource_tag表

有一個許多人shared_resources之間一對多的關係和標籤。當我創建一個shared_resource我做到以下幾點:

  1. 的shared_resource添加到shared_resources表
  2. 標籤添加到標籤表
  3. 添加shared_resource_id和TAG_ID到shared_resource_tag表

我可以設法通過第1步和第2步,但出於某種原因,我無法對pivot table進行任何輸入。我不知道爲什麼。我在models建立的關係相應:

SharedResource

class SharedResource extends Eloquent{ 
    public function tags(){ 
     return $this->belongsToMany('Tag'); 
    } 
} 

Tag

class Tag extends Eloquent{ 
    public function sharedResources(){ 
     return $this->belongsToMany('SharedResource'); 
    } 
} 

然後當我創造我這樣做的條目:

 $tags = Array(); 
     $tags = explode(',', Input::get('tags')); 
     foreach($tags as $tag){ 
      $newTag = new Tag; 
      $newTag->name = $tag; 
      $newTag->save(); 
     } 

     //Pivot table entry 
     $resource->tags()->sync($tags); 

     $resource->save(); 

上面的代碼出現錯誤:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'shared_resource_id' in 'where clause' (SQL: select `tag_id` from `shared_resource_tag` where `shared_resource_id` is null) 

我來怎麼回事很迷茫,我明白了Eloquent做出實施這些N:N的關係容易。

+0

下獲取更多here不是真的,否則我不認爲我會採取了鍵入問題的時間...... – Javacadabra 2014-08-27 16:44:48

+0

那麼你在那張桌子上有'shared_resource_id'字段..? – 2014-08-27 16:49:34

回答

1

sync()方法將需要標記的id,而不是您要給它的字符串名稱。您可以嘗試類似:

$tags = Array(); 
$tagIds = Array(); 
$tags = explode(',', Input::get('tags')); 
foreach($tags as $tag){ 
    $newTag = new Tag; 
    $newTag->name = $tag; 
    $newTag->save(); 
    $tagIds[] = $newTag->id; 
} 

//Pivot table entry 
$resource->tags()->sync($tagIds); 

$resource->save(); 

可以Using Sync To Attach Many To Many Models

+0

我看你說什麼@Chris G,我仍然得到錯誤,雖然有關'未找到列:1054未知列'shared_resource_id',我試圖保存資源之前進行數據透視表項,但沒有奏效 – Javacadabra 2014-08-27 16:47:30

+0

@Javacadabra - 你可能需要添加你加入的列名:'return $ this-> belongsToMany('SharedResource');'。從手冊中:'return $ this-> belongsToMany('Role','user_roles','user_id','foo_id');'看起來Laravel正試圖建立一個不存在的連接(因爲缺少列),所以你必須在你的模型中強制它們覆蓋默認的動作。 – 2014-08-27 18:32:30

0
$tags = explode(',', Input::get('tags')); 
    // Create or add tags 
    $tagIds = array(); 

    if ($tags) 
    { 
     $found = $this->tag->findOrCreate($tags); 
     foreach ($found as $tag) 
     { 
      $tagIds[ ] = $tag->id; 
     } 
    } 

    // Assign set tags to model 
    $model->tags()->sync($tagIds);