[Resuelto] guardar elementos con un foreach

Publicado hace 3 meses por checho

Hola a todos, mi problema es el siguiente:

tengo la tabla de users y debe estar relacionado con la tabla tags , dicha relacion ya la tengo, es de muchos a muchos. Un tag es un input dinamico que le debe aparecer al usuario al actualizar los datos o al registrarse, los campos los crea un administrador: tag_name (nombre del tag), tag_type (tipo de tag para el input, "date,text,email,password, etc..."), y tag_status (estado del tag, "activo o inactivo")

si un usuario x se va a registrar o actualizar sus datos le deben aparecer los tags activos, ahora como hago para guardar el id del usuario (user_id), id del tag (tag_id) y la respuesta del usuario a ese tag (tag_user_response) estos datos son la tabla intermedia entre el usuario y el tag

tabla user_tags

Schema::create('user_tags', function (Blueprint $table) {
            $table->increments('id');

            $table->integer('user_id')->unsigned();
            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
            $table->integer('tag_id')->unsigned();
            $table->foreign('tag_id')->references('id')->on('tags')->onDelete('cascade');

            $table->string('tag_user_response',400)->nullable()->default(null);

            $table->timestamps();
        });

modelo User_Tag

	<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User_Tag extends Model
{

  protected $fillable = [
    'tag_user_response',
  ];

  protected $table = 'user_tags';

  public function tag()
  {
    return $this->belongsTo(Tag::class);
  }

  public function User()
  {
    return $this->belongsTo(User::class);
  }
}

tabla users

Schema::create('users', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name', 60);
            $table->string('email',200)->unique();
            $table->string('password',150);
            $table->boolean('confirmed')->default(0);
            $table->string('confirmed_code',25)->nullable();
            $table->rememberToken();
            $table->timestamps();
        });

modelo User

	<?php

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
  use Notifiable;
  
  /**
  * The attributes that are mass assignable.
  *
  * @var array
  */
  protected $fillable = [
    'name',
    'email',
    'password',
    'confirmed',
    'confirmed_code',        
  ];
  
  /**
  * The attributes that should be hidden for arrays.
  *
  * @var array
  */
  protected $hidden = [
    'password', 'remember_token',
  ];
  
  
  public function Tags_For_User()
  {
    return $this->hasMany(User_Tag::class);
  }
}

tabla tags

	Schema::create('tags', function (Blueprint $table) {
            $table->increments('id');

            $table->string('tag_name', 45);
            $table->string('tag_type', 45);
            $table->boolean('tag_status');

            $table->timestamps();
        });

modelo Tag

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Tag extends Model
{
  /**
   * The attributes that are mass assignable.
   *
   * @var array
   */
  protected $fillable = [
      'tag_name',
      'tag_type',
      'tag_status',
  ];

  protected $table = 'tags';

  public function Tags_For_User()
    {
        return $this->hasMany(User_tag::class);
    }

}

este es el form donde muestro los inputs dinamicos, comó envio el id del tag y la respuesta que el usuario coloque en este input

en el metodo create de UserController:

<div class="row">
	@foreach($tagss as $tag)
	<div class="form-group">
		<div class="col-md-6">
			<label for="{{$tag->tag_name}}" class="col-md-4 control-label">{{$tag->tag_name}}</label>
			<input id="{{$tag->tag_name}}" type="{{$tag->tag_type}}" class="form-control"  name="tags[{{$tag->id}}]" required>
		</div>
	</div>
	@endforeach
</div>

como esta en este momento, la posicion del arreglo es igual al id del tag, y trae la respuesta hago un dd($request->tags); que viene del form y me devuelve esto

array:3 [▼ 2 => "co-workers" 3 => "20" 1 => "developer" ]

2 corresponde al tag "empresa", 3 al tag "edad", y 1 al tag "profesion"

dentro del foreach hago dd($tag); la respuesta es: "co-workers" es decir la respuesta al tag 2 como puedo guardar el tag_id que tengo ahi en el foreach, y que coincida con su respuesta

public function store(UserRequest $request)
    {
      try
      {
        $user = new  User;
        DB::beginTransaction();

        $user->name = $request->name;
        $user->email = $request->email;
        $user->password = bcrypt($request->password);
        // $user->confirmed = 1;
        $user->save();
      dd($request->tags);

        foreach ($request->tags as $tag)
        {
          $user_has_tag = new User_Tag;
          $user_has_tag->tag_id = (int) $tag;
					$user_has_tag->user_id = $user->id;
          $user_has_tag->tag_user_response = $tag;
          $user_has_tag->save();
        }
        DB::commit();
        return redirect()->route('admin-users.index')->with('info', 'El usuario ha sido creado con éxito.');
      } catch (\Exception $e)
      {
        dd($e->getMessage());
        DB::rollback();
        return redirect()->route('admin-users.index')->with('error', 'Lo sentimos ha ocurrido un error');
      }
    }

Gracias de antemano a todos y estoy atento a posibles soluciones ;)

Editado
Mejor respuesta Marcada por Colombia checho

checho hace 3 meses

request->tags ya es viene como un arreglo, si le hago esto dd($request->tags);

me devuelve esto

array:3 [▼
  1 => "co-workers"
  2 => "developer"
  3 => "20"
]

con

	$tags = explode(',', $request->tags);
  dd($tags);       

me devuelve esto:

"explode() expects parameter 2 to be string, array given"

	$tags = explode(',', $request->tags);
        dd($tags);

        foreach ($request->tags as $tag)
        {
          $user_has_tag = new User_Tag;
          $user_has_tag->tag_id = (int) $tag;
					$user_has_tag->user_id = $user->id;
          $user_has_tag->tag_user_response = $tag;
          $user_has_tag->save();
        }

con

$tags = implode(',', $request->tags);
dd($tags);   

me devuelve esto:

"co-workers,developer,20"

pero estas con las respuestas, a los tags, necesito es guardar el id de los tags en el foreach "$user_has_tag->tag_id = (int) $tag;" en esta linea