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
3 Réponses :
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é.
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 } }
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.
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!
montrez votre modèle de message et de photo
ajouté, veuillez vérifier
Définissez une relation
hasMany
entrePost
etPhoto
. 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 dePost.php
etPhoto.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.