как сделать JOINTURE (присоединиться) в laravel - PullRequest
0 голосов
/ 10 июля 2019

У меня есть две таблицы SALARIES и POINTAGES И между ними есть отношение hasMany, которому я хочу отображать для каждой POINTAGE SALARIES, но она дает мне пустые данные. consulter.blade.php

@foreach($pointages as $pointage)
<tr>
  <td>{{ $pointage->datep }}</td>
  <td>{{ $pointage->chantier }}</td>
  <td>{{ $pointage->ouvrage }}</td>
  <td>{{ $pointage->nbrj }}</td>
  <td>{{ $pointage->solde }}</td>
  <td>{{ $pointage->salarie->nom }}</td>
</tr>
@endforeach

Pointage.php

 protected $fillable = [
  'salarie_id', 'datep', 'solde', 'nbrj' , 'ouvrage' , 'chantier' , 'prime' ,
];
 public function salarie(){
   return $this->belongsTo('App\Salarie');
 }

Salarie.php

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

поинты миграция:

public function up(){
  Schema::table('pointages', function (Blueprint $table) {
    $table->integer('salarie_id')->unsigned()->after('id');
    $table->foreign('salarie_id')->references('id')->on('salaries');  
  });
}

SalarieController.php

 public function consulter()
     {
      $salaries = Salarie::with('pointages')->get();
      $pointages = Pointage::with(["salaries"])->has("salarie")->get();
      return view('salarie.consulter', compact('salaries','pointages'));
    }

Ответы [ 2 ]

0 голосов
/ 10 июля 2019

Вам необходимо четко определить функции отношений:

// app\Salarie.php
class Salarie extends Model
{
    protected $fillable = ['nome'];
    public function pointages(){
        return $this->hasMany('App\Pointage','salarie_id','id');
    }
}
// app\Pointage.php
class Pointage extends Model
{
    protected $fillable = [
        'salarie_id', 'datep', 'solde', 'nbrj' , 'ouvrage' , 'chantier' , 'prime' ,
      ];
    public function salarie(){
        return $this->belongsTo('App\Salarie');
    }
}

И использовать, как показано ниже, для консультации по всем пунктам, связанным с таблицей зарплат:

// app\Http\Controllers\SalarieController.php
class SalarieController extends Controller
{
    public function consulter()
     {
        // test your model with this simple query
        // $salaries = Salarie::find(1);
        // $pointages = $salaries->pointages()->get();
        // return view('salarie.consulter', compact('pointages'));

        // if the upon test runs well, the follow codes will work 
        $salaries_ids = Salarie::with('pointages')->pluck('id');
        $pointages  = Pointage::whereHas('salarie', function($query) use ($salaries_ids) {
            $query->whereIn('salarie_id', $salaries_ids);
        })->get();
        return view('salarie.consulter', compact('pointages'));
    }
}

Надеюсь, это поможет, спросите меняесли нужно!

0 голосов
/ 10 июля 2019

Некоторые вещи, которые вы можете попробовать:

  1. Я не уверен, имеет ли это значение, но вы можете попробовать снять скобки в de with() примерно так: Pointage::with("salaries")->has("salarie")->get();
  2. Еще одна вещь, которую вы должны проверить, если правильные первичные и внешние ключи Салари и Pointage. Документация Laravel гласит следующее:

    В приведенном выше примере Eloquent попытается сопоставить user_id из модели телефона с идентификатором в модели пользователя. Eloquent определяет имя внешнего ключа по умолчанию, проверяя имя метода отношения и добавляя суффикс имени метода к _id. Однако, если внешний ключ в модели телефона не является user_id, вы можете передать имя пользовательского ключа в качестве второго аргумента в методе ownTo.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...