Tengo 3 tablas: posts, tags, post_tag.

Cada Post tiene muchas etiquetas, así que uso hasMany método para ellos. Pero cuando voy a elegir, por ejemplo, 3 etiquetas en mi lista desplegable, no puedo agregar a post_tag y como el resultado no puedo seleccionar y mostrar cada uno de los post de etiquetas.

Mi Post modelo:

 class Post extends Eloquent{
 public function tag()
         {
           return  $this->hasMany('Tag');
         }
    }

Mi Tag modelo:

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

}

Y mi postController:

class postController extends BaseController{

public function addPost(){

    $post=new Post;

    $post_title=Input::get('post_title');
    $post_content=Input::get('post_content');
    $tag_id=Input::get('tag');

    $post->tag()->sync($tag_id);
    $post->save();

Puedo esperar para guardar este post_id guardar para post_tag mesa con su etiqueta id,
pero no funciona. Gracias por su tiempo.

Si una relación tiene una tabla dinámica, a continuación, los dos lados de la misma debe ser belongsToMany. También usted realmente debería nombre del método tags no tag como es una *Muchos de relación.
sí tienes razón :). y el otro problema era que $post->tag()->sync($tag_id); $post->save(); estos senteces lugar se debe reemplazar. gracias
He añadido una respuesta que explica mi comentario un poco más e incluye su propia corrección.

OriginalEl autor saha | 2014-07-03

3 Comentarios

  1. 8

    Tiene una idea básica de la derecha, pero hay un par de problemas con el código. Algunos están dejando de funcionar y algunos son simplemente convencional cuestiones.

    Primero, este es un belongsTomany relación (tiene una tabla dinámica) por lo que debe definir ambos lados de la relación como belongsToMany (incluso si hasMany es la manera de pensar acerca de uno o ambos de los lados de la misma). Esto es debido a que Laravel espera una cierta estructura de base de datos con los dos diferentes tipos de relaciones.

    Otro tema (de que has encontrado a ti mismo) es que se añaden las etiquetas a la relación (a través de ->tag()->sync() antes de que usted realmente ha guardado el post. Primero debe guardar el post (para que laravel sabe lo IDENTIFICADOR para agregar a la tabla dinámica para post_id) y, a continuación, agregue las relaciones. Si usted está preocupado acerca de las etiquetas de la parte fallando y luego tener una base de datos incoherente debe utilizar transacciones.

    Por último, el «convenio» de los errores que tiene es que pertenece a muchos relación, por definición, implica colecciones de los resultados. Como tal, tag y post fuera tags y posts respectivamente.

    Así que aquí está mi versión reescrita de su código:

    class Post extends Eloquent
    {
        public function tags()
        {
            return $this->belongsToMany('Tag');
        }
    }
    
    class Tag extends Eloquent
    {
        public function posts()
        {
            return $this->belongsToMany('Post');
        }
    }
    
    class PostController extends BaseController
    {
        public function addPost()
        {
            //assume it won't work
            $success = false;
    
            DB::beginTransaction();
    
            try {
                $post = new Post;
    
                //maybe some validation here...
    
                $post->title = Input::get('post_title');
                $post->content = Input::get('post_content');
    
                if ($post->save()) {
                    $tag_ids = Input::get('tags');
                    $post->tags()->sync($tag_ids);
                    $success = true;
                }
            } catch (\Exception $e) {
                //maybe log this exception, but basically it's just here so we can rollback if we get a surprise
            }
    
            if ($success) {
                DB::commit();
                return Redirect::back()->withSuccessMessage('Post saved');
            } else {
                DB::rollback();
                return Redirect::back()->withErrorMessage('Something went wrong');
            }
        }
    }

    Ahora un montón de que el código de controlador de centros alrededor de la transacción cosas – si no te importa mucho acerca de eso, entonces ya está todo bien para eliminarlo. También hay varias maneras de hacer que la transacción cosas – he ido con uno que no es ideal, pero obtiene el punto a través de una mínima cantidad de código.

    OriginalEl autor alexrussell

  2. 6

    Para insertar datos en una tabla dinámica de nombre diplome_user, sólo tienes que seguir mi ejemplo: mi tabla dinámica parecida a:

    Insertar datos a una tabla dinámica en laravel

    //this is Diplome Model
    
        class Diplome extends Model
        {
        public function users()
            {
                return $this->belongsToMany('App\User','diplome_user')->withPivot('etablissement', 'annee', 'mention');;
            }
        }

    ahora dentro de mi DiplomeController, soy capaz de hacer esta consulta:

    $user = Auth::user(); 

    porque necesito un usuario, acabo de tener conectado uno, después de esto, puedo crear una instancia de Diplome como:

    $diplome = new Diplome();
    $diplome->libelle = "the name";
    $diplome->decription= "description of the ...";
    $diplome->save();

    ahora el paso más importante es:

       $diplome->users()->attach($user, ['etablissement'=> 'bib',
                                                'annee'=>'2015',
                                                'mention'=>'AB',
                                                ]);

    Aquí está el resultado:

    Insertar datos a una tabla dinámica en laravel

    gracias #halfer !!!!

    OriginalEl autor Boston Kenne

  3. 4

    La sync() método quiere una matriz. Se debe trabajar si usted acaba de poner el id de etiqueta de dentro de uno, así:

    $post->tag()->sync([$tag_id]);
    Call to undefined method Illuminate\Database\Query\Builder::sync() . aparece siempre 🙁
    tan lejos como puedo saber el código anterior sería, de hecho, el envío de una matriz – $tag_id viene Input::get('tag') que, en la introducción, OP dice: «cuando yo elegir, por ejemplo, 3 etiquetas en mi lista desplegable», lo que sugiere que es una matriz como de entrada. Dicho esto, supongo que no deberíamos asumir.
    Muy buen punto, gracias.

    OriginalEl autor Joel Hinz

Dejar respuesta

Please enter your comment!
Please enter your name here