J'ai cette structure de table, project a one to many relation avec rewards, rewards and shipping a many to many relation avec le tableau croisé dynamique reward_ship.

projects       rewards         shipping       reward_ship
---------      --------        --------       ------------ 
id             id              id             id 
title          amount          location       reward_id
amount         project_id      name           ship_id

J'essaye d'extraire un détail project particulier avec toutes les autres données de tables associées (rewards and shipping données utilisant la table reward_ship) dans une requête.

Voilà comment j'essaye

Modèle de projets

    class Rewards extends Model {
         public function projs(){
              return $this->hasMany('App\Rewards');
          }
         public function rewds(){
              return $this->belongsToMany('App\Shipping')
              ->withPivot('reward_ship', 'ship_id', 'reward_id');
         }
         public function shiplc(){
               return $this->belongsToMany('App\Rewards')
               ->withPivot('reward_ship', 'ship_id', 'reward_id');
         }
      }
class Rewards extends Model {
    public function proj() {
        return $this->belongsTo('App\Projects');
    }
}

Classe API du contrôleur

Route::get('projects/{id}', function($id) {
$p = Projects::find($id);
$getd = Rewards::with('proj')
    ->where('rewards.project_id', '=', $p->id)
    ->get();
 }); 

Ça ne marche pas. Je recherche et ai essayé de nombreuses requêtes de base de modèles connexes dans laravel. je sais que ma mise en œuvre est fausse. Veuillez me suggérer de travailler.

0
Raikumar Khangembam 15 nov. 2017 à 21:29

4 réponses

Meilleure réponse

Vous devez réparer les relations que vous entretenez:

Modèle de projets:

public function rewards(){
    return $this->hasMany('App\Rewards');
}

Modèle de récompenses:

public function projects() {
    return $this->belongsTo('App\Projects');
}

public function shippings(){
    return $this->belongsToMany('App\Shipping','reward_ship', 'reward_id', 'ship_id');
}

Modèle d'expédition:

public function rewards(){
    return $this->belongsToMany('App\Rewards','reward_ship', 'ship_id', 'reward_id');
}

Après cela, vous pouvez appeler les relations dans le contrôleur pour charger les éléments voulus comme ceci:

$project = Projects::with('rewards.shippings')
                    ->where('id', $project_id)
                    ->get();

Et dans la vue, vous pouvez parcourir les récompenses puis obtenir les expéditions comme ceci:

@foreach ($project->rewards as $reward)
    <p>This is a reword {{ $reward->amount }}</p>
    @foreach ($reward->shippings as $shipping)
        <p>This is a shipping {{ $shipping->name }}</p>
    @endforeach 
@endforeach 
1
Maraboc 15 nov. 2017 à 19:11
class Project extends Model
{
    public function rewds()
    {
        return $this->hasMany('App\Rewards');
    }

    public function shiplc()
    {
        return $this->hasManyThrough('App\Shipping', 'App\Rewards');
    }
}

class Rewards extends Model
{
    public function shiplc()
    {
        return $this->belongsToMany('App\Shipping');

    }

    public function projs()
    {
        return $this->belongsTo('App\Project');
    }

}

class Shipping extends Model
{
    public function shiplc()
    {
        return $this->belongsToMany('App\Shipping');

    }
}

Route::get('projects/{id}', function($id) {
    $p = Projects::with(['rewds', 'shiplc'])->find($id);
});
1
Hamoud 15 nov. 2017 à 19:06

Projet.php

class Project extends Model {
    public function rewards() {
        return this->hasMany(Reward::class, 'project_id', 'id');
    }
}

Récompense.php

class Reward extends Shipping {
    public function shipping(){
        return $this->belongsToMany(Shipping::class, 'reward_ship', 'reward_id', 'ship_id');
    }

    public function project(){
        return $this->belongsTo(Project::class);
    }
}

Vous pouvez le récupérer comme ceci:

$projectDetails = Project::where('id', $projectId)
                             ->with(['rewards', 'rewards.shipping'])->get();
1
Rutvij Kothari 15 nov. 2017 à 19:10

Vous pouvez utiliser la nouvelle fonctionnalité de Laravel 5.5 Ressources API.

Il vous aide à formater la sortie d'objets tels que des modèles ou des collections, à afficher des attributs et également des relations.

Donc, vous pouvez faire quelque chose comme ça dans votre ItemResource:

    <?php

    namespace App\Http\Resources;

    use Illuminate\Http\Resources\Json\Resource;

    class Project extends Resource
    {
        /**
         * Transform the resource into an array.
         *
         * @param  \Illuminate\Http\Request
         * @return array
         */
        public function toArray($request)
        {
            return [
                'project_id' => $this->project_id,
                'title' => $this->title,
                'amount' => $this->amount,
                // To access relationship attributes:
                'rewards' => $this->rewards->load('shippings'),
            ];
        }
    }

Ensuite, dans votre contrôleur, il vous suffit de créer une nouvelle instance Resource et de transmettre l'objet d'élément que vous souhaitez retourner:

use App\Http\Resources\Project as ProjectResource;

// some code

    /**
     * Show a single formatted resource.
     *
     * @param Project $project
     * @return ProjectResource
     */
    public function show($project)
    {
        return new ProjectResource($project);
    }

// the rest of your code

La sortie doit être celle attendue.

2
Kenny Horna 15 nov. 2017 à 19:10
47314747