Как объединить таблицы, используя laravel eloquent? - PullRequest
1 голос
/ 25 сентября 2019

код:

function viewPDF()
{
$reports = Report::with([
        'quarters' => function($query) {
            // filters on quarters table
            return $query->where('column', 'value');
        },
        'presidents' => function($query) {
            // filters on presidents table
            return $query->where('column', 'value');
        }
    ])
    ->filter()  // only for reports table
    ->latest()
    ->get();

$pdf = PDF::loadView('reports.test1', ['reports' => $reports]);
return $pdf->stream('reports.pdf');
}

Хочу сделать по Красноречивому пути.Пожалуйста, как мне это сделать?

1-стол quarters

Schema::create('quarters', function (Blueprint $table) {
    $table->increments('id');
    $table->string('title');
    $table->timestamps();
});
Schema::create('quarter_report', function (Blueprint $table) {
    $table->integer('quarter_id')->unsigned();
    $table->integer('report_id')->unsigned();
    $table->primary(['quarter_id' , 'report_id']);
});

2- стол presidents

Schema::create('presidents', function (Blueprint $table) {
        $table->Increments('id');
        $table->string('P_name');
        $table->timestamps();
    });
 Schema::create('president_report', function (Blueprint $table) {
        $table->integer('president_id')->unsigned();
        $table->integer('report_id')->unsigned();
        $table->primary(['president_id','report_id']);
    });

3- Таблица reports

Schema::create('reports', function (Blueprint $table) {
        $table->Increments('id');
        $table->integer('user_id')->unsigned();
        $table->string('target_value');
        $table->text('major_activity');
        $table->string('indicator');
        $table->string('responsibility');
        $table->string('progress_activity');
        $table->string('documents')->nullable();
        $table->string('percentage_activity')->nullable();
        $table->text('problem')->nullable();
        $table->text('solution')->nullable();
        $table->text('description')->nullable();
        $table->string('image')->default('default.png');
        $table->tinyInteger('status')->default('0');
        $table->tinyInteger('active')->default('0');
        $table->timestamps();
    });

Модель отчета

class Report extends Model
{

public function quarters() {
    return $this->belongsToMany('App\Quarter', 'quarter_report', 'report_id', 'quarter_id');
}

public function presidents() {
    return $this->belongsToMany('App\President', 'president_report', 'report_id', 'president_id');
}

public function scopeFilter($query){
    $president = request('president');
    if ( isset($president)&& trim($president) != '' && $president != 'all'){
        $query->whereHas('presidents' , function ($query )use ($president){
            $query->whereId($president);
        });
    }
    $quarter = request('quarter');
    if ( isset($quarter)&& trim($quarter) != '' && $quarter != 'all'){
        $query->whereHas('quarters' , function ($query )use ($quarter){
            $query->whereId($quarter);
        });
    }


  }

Президент Модель

class President extends Model
{

public function reports() {
    return $this->belongsToMany('App\Report', 'president_report', 'president_id', 'report_id');
}
}

Квартальная модель

class Quarter extends Model
{
public function reports() {
    return $this->belongsToMany('App\Report', 'quarter_report',  'quarter_id', 'report_id');
}
 }

Ответы [ 3 ]

0 голосов
/ 25 сентября 2019

Вы хотите присоединиться к таблице presidents с таблицей president_report.Но вы присоединились к president_report таблице дважды.Правильный путь должен быть

$reports = Report::join('president_report', 'reports.id', '=','president_report.report_id')
    ->join('presidents', 'presidents.id', '=', 'president_report.president_id')
    ->join('quarter_report', 'president_report.report_id', '=', 'quarter_report.report_id')
    ->latest('reports.created_at')
    ->get();
0 голосов
/ 25 сентября 2019

Если вы хотите использовать красноречивое использование laravel, как показано ниже:

В Report.php

class Report extends Model 
{
    public function quarters() {
        return $this->belongsToMany('App\Quarter', 'quarter_report', 'report_id', 'quarter_id');
    }

    public function presidents() {
        return $this->belongsToMany('App\President', 'president_report', 'report_id', 'president_id');
    }

}

В Quarter.php

class Quarter extends Model 
{
    public function reports() {
        return $this->belongsToMany('App\Report', 'quarter_report', 'quarter_id', 'report_id');
    }


}

В President.php

class President extends Model 
{
    public function reports() {
        return $this->belongsToMany('App\Report', 'president_report', 'president_id', 'report_id');
    }

}

В контроллере

function viewPDF()
{
    $reports = Report::with(['quarters', 'presidents']);

    if ( request('president') ) {
        $reports = $reports->whereHas('presidents' , function ($query) {
            $query->whereId( request('president') );
        });
    }

    if ( request('quarter') ) {
        $reports = $reports->whereHas('quarters' , function ($query) {
            $query->whereId( request('quarter') );
        });
    }

    $reports = $reports->latest()
        ->get();

    $pdf = PDF::loadView('reports.test1', ['reports' => $reports]);
    return $pdf->stream('reports.pdf');
}
0 голосов
/ 25 сентября 2019

Вы не присоединяетесь к таблице presidents. Включите это тоже ..

 $reports = DB::table('president_report')
 ->join('reports', 'reports.id', '=', 'president_report.report_id')
 ->join('quarter_report', 'president_report.report_id', '=', 'quarter_report.report_id')
 ->join('presidents','president_report.president_id','=','presidents.id')
 ->select('president_report.*','reports.*','quarter_report.*','presidents.id','presidents. P_name')
 ->latest('reports.created_at')
 ->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...