1
votes

Ajouter un nouvel élément à une collection éloquente

J'ai deux tableaux et des photos. Chaque article contient 5 photos. Je veux lister chaque message avec une photo (photo de profil), première image.

Schema::create('posts', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->string('title');
    $table->timestamps();
});

Schema::create('photos', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->string('image');
    $table->integer('post');
    $table->timestamps();
});

class Post extends Model
{
    protected $table = 'posts';
}


class Photo extends Model
{
    protected $table = 'photos';
    protected $fillable = ['image', 'post'];
}

Ces deux me donnent deux collections différentes. Comment puis-je ajouter la première photo d'un article particulier à son tableau afin que je puisse l'afficher en utilisant une boucle foreach.

Voici comment je veux dans la vue:

@foreach($published_post as $item)
    {{ $item->title }}
    {{ $item->profile_photo }}
@endforeach


4 commentaires

montrez votre modèle de message et de photo


ajouté, veuillez vérifier


Définissez une relation hasMany entre Post et Photo . Voir laravel.com/docs/5.8/eloquent-relationships pour plus de détails sur la procédure. Il faudra un peu de logique supplémentaire pour n'en afficher qu'une lors de l'itération, mais essayez-la d'abord. De plus, en ce qui concerne votre modification, ce ne sont pas les modèles; ce sont les migrations. Afficher le contenu de Post.php et Photo.php .


@Thomas qui est le schéma de base de données, dans le dossier de l'application, vous y arriverez Modèle et oui, vous devez ajouter la clé primaire de la publication en tant que clé étrangère dans la table des photos.


3 Réponses :


1
votes

Vous devez créer 2 modèles, un pour les posts et un pour les photos.

@foreach($posts as $post)
    {{ $post->title }}
    {{ $post->photo[0]->name}}
@endforeach
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

use App\Photo;

class Post extends Model
{
    public function photos()
    {
        return $this->hasMany(Photo::class);
    }
}
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Photo extends Model
{
    //
}

Ensuite, créez une relation hasMany sur le modèle Post pour créer un lien vers le modèle photo

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Posts extends Model
{
    //
}

Ensuite, dans votre vue, vous pouvez charger paresseusement les photos quand vous le souhaitez

php artisan make:model Post
php artisan make:model Photo

La syntaxe à utiliser dans votre vue sera légèrement différente, mais cela vous donne une bonne idée du fonctionnement de la fonctionnalité.


0 commentaires

2
votes

Modèle de message:

@foreach($published_post as $item)
    {{ $item->title }}
    {{ $item->photos->first()->image }} // photos relation is invoked and fetched first image
@endforeach

Modèle photo:

<?php

    namespace App;
    use Illuminate\Database\Eloquent\Model;


    class Photo extends Model
    {
        /*This is used to specify the table which this model is associated with*/
        protected $table = 'photos';

        protected $fillable = [
          'image', 'post'
        ];
        public $timestamps = true;

    }

Afficher:

<?php

    namespace App;
    use Illuminate\Database\Eloquent\Model;


    class Post extends Model
    {
        /*This is used to specify the table which this model is associated with*/
        protected $table = 'posts';

        protected $fillable = [
          'title'
        ];
        public $timestamps = true;

        public function photos(){
            return $this->hasMany(Photos::class,'post');
            //post is the foreign key for posts table
        }
    }


2 commentaires

Répondez-moi à une question. Pour autant que je sache, l'exemple ci-dessus est absent, il y a une spécification que: dans le tableau des photos, vous devez avoir la colonne post_id avec l'identifiant de publication auquel la ou les photos appartiennent. sans cela, il n'y a aucun moyen de relier les choses. Ai-je raison?


Oui tu as raison. post_id doit être utilisé comme clé étrangère dans la table photo.



0
votes

D'accord, vous devez d'abord changer votre modèle de publication comme ceci:

@foreach($published_post as $item)
    {{ $item->title }}
    {{ $item->photos()->first()->name }}
@endforeach

Et puis, ajoutez ce qui suit à votre modèle de photo:

$published_post = Post::where('created_by',auth()->user()->id)
                      ->where('status','published')
                      ->with('photos')
                      ->get();

Avec cela, vous avez créé la relation entre vos modèles, et maintenant vous pouvez obtenir vos données de cette façon:

class Photo extends Model
{
    protected $table = 'photos';

    public function post()
    {
        return $this->belongsTo(Post::class, 'post');
    }
}

Et à votre avis, vous pouvez obtenir le premier photo de cette façon:

class Post extends Model
{
    protected $table = 'posts';

    public function photos()
    {
        return $this->hasMany(Photo::class, 'post');
    }
}

Pour plus d'informations sur les relations, vous pouvez consulter le docs .

J'espère que cela vous aidera!


0 commentaires