Estoy tratando de hacer babosas simples y únicas. Las babosas se guardan correctamente en la base de datos, por lo que la función está funcionando. Tengo problemas para hacerlos únicos.

Tengo esta regla en TagCreateRequest.php

public function rules()
{
    $rules = [
        'tag' => 'required|min:3',
        'tag_slug' => 'required|alpha_dash|unique:tag,tag_slug,'
    ];

    $rule = 'unique:tag';

    $segments = $this->segments();
    $id = intval(end($segments));
    if ($id != 0) {  
         $rule .= ',tag_slug,' . $id;
    }
    $rules['tag_slug'][] = $rule;
        return $rules;      
} 

Y esto en mi función de tienda en el controlador

  public function store(TagCreateRequest $request)
  {

        $tag = new Tag();
        foreach (array_keys($this->fields) as $field) {             
            $tag->$field = $request->get($field);               
        }

        $tag->save();       
        return redirect()->route('tags');
  }

El error se trata de intentar agregar valor duplicado

SQLSTATE [23000]: violación de la restricción de integridad: 1062 Entrada duplicada 'slug único' para la clave 'tags_tag_unique'

¿Alguien puede ayudarme a solucionar este problema?

0
user8323337 17 oct. 2017 a las 15:37

3 respuestas

La mejor respuesta

Puede acceder al campo id por arte de magia. ID debe ser el mismo parámetro de ruta utilizado en su ruta.

Si utiliza un parámetro de identificación como Route::put('post/{id}/update'), puede acceder mágicamente al parámetro de identificación dentro de su solicitud de formulario. De lo contrario, si llama al parámetro {post} Route::put('post/{post}/update'), en su solicitud de formulario debe llamar $this->post en lugar de $this->id, ¿de acuerdo?

Por favor pruebalo:

public function rules()
{
    $rules = [
        'tag' => 'required|min:3'
    ];

    $slugRule = 'required|alpha_dash|unique:tag_slug';

    if (! empty($this->id)) {
        $slugRule = 'required|alpha_dash|unique:tag_slug,'.$this->id;
    }

    $rules['tag_slug'] = $slugRule;

    return $rules;
}

Este FormRequest funcionará bien en los métodos store () y update () si lo inyecta en ambos métodos.

Míralo:

// Your store route
Route::post('/post/store', ['as' => 'post.store', 'uses' => 'YourController@store']);

// YourController store method
public function store(NameSpaced\FormRequest $request)
{
   // ...     
}

// Your update route
Route::post('/post/{id}/update', ['as' => 'post.update', 'uses' => 'YourController@store']);

// YourController update method
public function update(NameSpaced\FormRequest $request)
{
    // ...     
}
1
Mauricio Rodrigues 17 oct. 2017 a las 13:26

Sugeriría que genere automáticamente una nueva babosa cada vez que cree una etiqueta. Me metí en los mismos problemas que ha enumerado aquí, así que decidí generar automáticamente cada vez que estoy creando un nuevo elemento. Solía laravel-sluggable. Genera automáticamente babosas únicas.

Según su pregunta, he definido una regla de babosa única en una de mis aplicaciones de demostración como esta:

public function rules()
{
    return [
        'name'  => 'required|string|max:255',
        'slug'  => 'required|string|max:255|unique:categories,slug,'.$this->segment(3),
    ];
}

Tenga en cuenta que $this->segment(3) se refiere a la identificación del modelo que se actualiza en las páginas de back-end, puede ser diferente en su aplicación.

0
Raza Mehdi 17 oct. 2017 a las 13:20
$rules = [
    'tag' => 'required|min:3',
    'tag_slug' => 'required|alpha_dash|unique:[table name],[column name]'
];

Pruebe esto, el primero es el nombre de la tabla y el segundo es el nombre de la columna que desea que sea único, escriba sin agregar llaves cuadradas. o simplemente pasas el nombre de la tabla así,

$rules = [
    'tag' => 'required|min:3',
    'tag_slug' => 'required|alpha_dash|unique:[table name]'
];

Laravel comprueba automáticamente la columna. Espero que ayude.

0
Rits 17 oct. 2017 a las 12:42