2014-10-20 1 views
1

Привет Я пытаюсь обновить tagtask таблицу (сводной таблицы), когда следующая ситуация возникает:Удаление строк и вставка строки в сводной таблице Laravel

Так, например, у нас уже есть задача, которая имеет 3 метки с ним например, маркетинг, развитие, бухгалтерский учет. Теперь мы хотим отредактировать эту задачу и удалить эти теги и добавить 1 тег, называемый кулинарией.

Так что я имею в виду, это удалить те 3 тега из таблицы tagtask и добавить тег 'cooking' в таблицу tagtask. Также я не удаляю теги из таблицы тегов, потому что есть задачи, которые используют маркетинг или разработку или тег учета.

К сожалению, о первой части, о которой я имел в виду, я не мог этого понять. Для того, чтобы показать вам, что я пытался, я сначала покажу вам кусок кода с моей точки зрения:

{{Form::model($task,array('route'=>array('user.tasks.update', $task->id), 'method'=>'put'))}} 
    <ul> 
     <li> 
       {{Form::label('tag', 'tags')}} 
       <input type="text" name="tag_name" class="form-control" value='@foreach($task->tagtask as $tt){{$tt->tag['tag_name']}} @endforeach'> 
     </li> 
     <li> 
       {{Form::submit('Edit Task', array('class' => 'btn btn-default'))}} 
     </li> 
    </ul> 
{{Form::close()}} 

А вот мой TaskController.php со следующим фрагментом кода:

Так что я достиг с этим кодом, я могу удалить 3 тега (как я упоминал ранее) в представлении и добавить новый тег для обновления. Новый тег затем сохраняется в таблице tagtask и таблице тегов, но проблема в том, что старые теги 3 все еще находятся в таблице tagtask. Хотя они должны быть удалены .. Может ли кто-нибудь помочь мне, пожалуйста? Я с нетерпением жду ответа. В любом случае спасибо за ваш ответ.

ответ

0

У меня есть решение для тех, кто заинтересован. Единственные изменения были внесены в TaskController.php. Вот код с комментариями, так что вы можете понять это гораздо проще:

<?php 
public function update($id) 
    { 
     $str = Input::get('tag_name'); 
     //Split string by a regular expression 
     $inputTags = preg_split('/[, ;]/', $str); 

     $tt_current = Tagtask::where('id_task', $id)->get(); 
     $oldTaskTagsToDestroy = array(); 

     $tags_raw = Tag::all(); 
     $tags = array(); 

     foreach($tt_current as $item) 
     { //id_tag is the key with the tagtaskID as value. 
      $oldTaskTagsToDestroy[$item->id_tag] = $item->id; 
     } 

     foreach($tags_raw as $tag) 
     { //tag_name is the key with the tagID as value. 
      $tags[$tag->tag_name] = $tag->id; 
     } 

     foreach($inputTags as $tag) 
     { 
      if(!isset($tags[$tag])) 
       /* At first in $tag lives the name of the tag that was given through 
       input from a user. After that we return the id through the insertGetId() method and 
       put in $tags[$tag]*/ 
       $tags[$tag] = DB::table('tags')->insertGetId(
        array('tag_name' => $tag) 
       ); 

       //for example tagtask ID 40 exists, so we don't execute the body of the if statement 
      if(!isset($oldTaskTagsToDestroy[ $tags[$tag] ])){ 

       $data_TagTask= array(
         'id_task' => $id, 
         'id_tag' => $tags[$tag] 
         ); 

       DB::table('tagtasks')->insertGetId($data_TagTask); 

      } else 
       /*So we remove the key and the value of tagtask ID 40, because it's again present in the new input. 
       We must do this, so that the old tasktags ID's will not be deleted from the tagtask table.*/ 
       unset($oldTaskTagsToDestroy[ $tags[$tag] ]); 
     } 
     //And here we remove old tagtask ID's that aren't present anymore/again with the new input. So we delete them from the database. 
     foreach($oldTaskTagsToDestroy as $key => $value) 
     { 
       Tagtask::destroy($value); 
     } 

     return Redirect::route('user.tasks.index'); 
    } 

Чтобы быть на самом деле честно, я получил помощь от моей интернатуры супервизора. Я стажер в компании, которая создает веб-приложения. Я делаю все возможное, чтобы быть хорошим программистом.

1

Для этого вы должны использовать sync. Может быть, я что-то пропустил, но код должен быть что-то вроде этого:

public function update($id) 
{ 
    $task = Task::findOrFail($id); 
    $str = Input::get('tag_name'); 
    //Split string by a regular expression 
    $arrayTags = preg_split('/[, ;]/', $str); 

    $tagIds = []; 
    foreach ($arrayTags as $tag) { 
     // here you can apply trim or skipping empty tags 
     $fTag = Tag::firstOrCreate(['tag_name' => $tag]); 
     $tagIds[] = $fTag->id; 
    } 

    $task->tags()->sync($tagIds); 

    return Redirect::route('user.tasks.index'); 
} 

, конечно, нужно иметь tags отношение к Task модели

+0

привет спасибо за ваш ответ еще раз! Могли бы вы или кто-то еще показать мне версию построителя запроса? Если это слишком много, я не против. Это из-за моего любопытства, хе-хе. Я проведу ваш код после того, как спал, потому что на данный момент я действительно устал. – superkytoz

+0

@superkytoz Если вы используете Eloquent, вы должны использовать его, потому что гораздо легче выполнять некоторые задачи. Используя построитель запросов, вы получите, вероятно, такой длинный код, как ваш –

+0

Я получаю следующую ошибку, когда я использую метод sync(): вызов неопределенного метода Illuminate \ Database \ Query \ Builder :: sync() Я также сделал снимок экрана это: http://i.imgur.com/eJ6CPIv.png Вот код, который я использую в своем контроллере: $ task-> tagtask() -> sync ($ tagIds); А вот метод tagtask(), который живет в моей модели задачи: публичная функция tagtask() \t {\t \t \t // oneToMany \t \t возвращение $ this-> hasMany ('Tagtask', 'id_task', «идентификатор «); \t} – superkytoz