Laravel 6

relation entre deux table

Avatar de Pat2010
Pat2010

J'ai une table post et une table image pour une publication je veux lui associer plusieurs images alors j'ai creé une clé étranger dans la table post qui identifie chaque image d'une publication mais quand j'execute le code j'obtiens l'erreur ci-dessous:

SQLSTATE[HY000]: General error: 1364 Field 'filename_id' doesn't have a default value (SQL: insert into `posts` (`category_id`, `Titre`, `Price`, `Description`, `Etat`, `Adresse`, `Phone`, `Ville`, `user_id`, `updated_at`, `created_at`) values (1, livre d'histoire, 45, mlklokjohjkk, option1, DOHA SALE, 0770351203, Rabat, 1, 2020-03-07 22:46:32, 2020-03-07 22:46:32))

voici ma classe postcontrolleur:

public function store(Request $request)
    {
        
         $this->validate($request,[
           'Titre' => 'required',
           'category_id' => 'required',
           'Price' => 'required',
           'Description' => 'required',
           'Etat' => 'required',
           //'filename_id' => 'required',
           'Adresse' => 'required',
           'Phone' => 'required',
           'Ville' => 'required',   
         ]);

        
        
        
        
        foreach ($request->file('filename') as $filename){


           $name=$filename->getClientOriginalName();
        
           $filename->move(public_path().'/images/', $name);
            
            $post = Auth::user()->posts()->create($request->all());
            
    
            $data = new Upload;
            $data->filename = $name;
            //$data ->post_id = $post->id;
           
            
            $data->save();

         }  
         
         

        
        
        $post->tags()->attach($request->tags);
        $post->filename_id = $data->id;
        
       

        
        return redirect()->back()->with('success', 'Votre annonnce a été ajoutée avec success.Merci');
    }

voici la classe qui controle les image uploadcontrolleur:

   */
    public function store(Request $request)
    {
       
         
        $this->validate($request,[
            'Titre' => 'required',
            'category_id' => 'required',
            'Price' => 'required',
            'Description' => 'required',
            'Etat' => 'required',
            'filename' => 'required|mimes:jpeg,png,jpg,bmp|max:2048',
            'Adresse' => 'required',
            'Phone' => 'required',
            'Ville' => 'required',   
          ]);
 
         
         
         
         
         foreach ($request->file('filename') as $filename){
 
 
            $name=$filename->getClientOriginalName();
         
            $filename->move(public_path().'/images/', $name);
 
            
             
             $post = Auth::user()->posts()->create($request->all());
     
             $data = new Upload;
             $data->filename = $name;
             //$data ->post_id = $post->id;
             $post->filename_id = $data->id;
             $data->save();
          }  
          
Avatar de raphimor
raphimor

Ca fait longtemps que j'ai plus codé mais je pense que dans ta fonction store du PostController il y plusieurs problèmes.

1- $post->filename_id = $data->id; A ce moment du code la variable $data "n'existe plus" donc effectivement $post->filename_id n'a pas de valeur.

2- Si j'ai bien compris tu as 1 article qui a plusieurs images? Donc tu devrais avoir tes tables ainsi:

Posts:

  • id
  • category_id
  • Titre
  • Price
  • Description
  • Etat
  • Adresse
  • Phone
  • Ville
  • user_id ...

Images:

  • id
  • ...
  • post_id <-- C'est cette clé traangère qui fait la liaison entre l'article et les image
Avatar de nash
nash

salut,

Perso je changerais completement le model db plus de clareté en suivant les conventions Laravel.

Table images : id, filename, ..., created_at,updated_at

Table posts : id, champ, champ, created_at, updated_at

Table posts_images: id, post_id, image_id

Coté model :

class Post extends Model
{
    //
    protected $table = 'posts';
    protected $guarded = ['id'];

    public function images()
    {
        return $this->belongsToMany(Image::class, 'posts_images');
    }

}

class Image extends Model
{
    protected $table = 'images';
    protected $guarded = ['id'];

    public function posts()
    {
        return $this->belongsToMany(Post::class, 'posts_images');
    }
}

Coté Controller: A noté que mes input name du formulaire sont post[champ1], post[champ2], et input file name est filename

public function store(Request $request)
    {
        $post = new Post($request->get('post'));

        if($request->hasFile('filename')) {
            foreach ($request->file('filename') as $filename){
                $file = $filename;
                $filename = sprintf('%s-%s.%s', str_slug(pathinfo($file->getClientOriginalName(), PATHINFO_FILENAME)), time(), $file->getClientOriginalExtension());
                $file->storeAs('upload/',$filename ,'public'); ATTENTION sauve le fichier dans storage

                $image = new Image(['filename' => $filename]);
                $image->save();

            $post->images()->attach($image);
            }
        }

        $post->save();

        return redirect()->route('la route', [$post]);
    }

Cette exemple est en Laravel 5.5 le helper str_slug n'existe plus en 6 et plus sera donc Str::slug()

Vous ne pouvez pas répondre à ce sujet.