Получить значение из ключа отношения - PullRequest
1 голос
/ 28 апреля 2020

Я разрабатываю приложение laravel, которое имеет следующие красноречивые модели:

  • App \ Models \ Dumpdb - Здесь я храню информацию обо всех файлах;
  • App \ Models \ DumpDownloadHistory - Здесь я храню историю загрузок всех клиентских файлов;

Это Dumpdb таблица и модель -

// Database table
Schema::create('dumpdbs', function(Blueprint $table){
  $table->bigIncreaments('id');
  $table->string('hw')->nullable();
  $table->string('hwtype')->nullable();
  $table->string('hwtype2')->nullable();
  $table->integer('kw')->nullable();
  $table->string('dataset')->nullable();
  $table->string('enginetype')->nullable();
  $table->string('euro')->nullable();
  $table->timestamps();
});

// Model
<?php

namespace App\Models;

use App\Models\DumpDownloadHistory;
use Illuminate\Database\Eloquent\Model;

class Dumpdb extends Model
{
  public function DumpDownloadHistory(){
    return $this->hasMany(DumpDownloadHistory::class);
  }
}

DumpDownloadHistory таблица и модель -

// Table
Schema::create('dump_download_histories', function(Blueprint $table){
  $table->bigIncreaments('id');
  $table->unsignedBigInteger('user_id');
  $table->unsignedBigInteger('file_id');
  $table->string('dataset')->nullable();
  $table->integer('downloadCost')->nullable();
  $table->timestamps();

  $table->foreign('user_id')->references('id')->on('users');
  $table->foreign('file_id')->references('id')->on('dumpdbs');
});

// Model
<?php

namespace App\Models;

use App\Models\Dumpdb;

use Illuminate\Database\Eloquent\Model;

class DumpDownloadHistory extends Model
{
    protected $fillable = ['user_id', 'dataset', 'downloadCost', 'file_id'];

    protected $table = 'dump_download_histories';

    protected $primaryKey = 'id';

    public function dumpDb(){
      return $this->belongs_to(Dumpdb::class, 'file_id');
    }
}

Мне нужно создать поисковый фильтр, где пользователь может искать файлы, которые он уже купил , Например, это все файлы из модели Dumpdb: enter image description here

Вот как я хочу выглядеть, если пользователь нажал на флажок «Оплатил»: enter image description here

Вот что я получаю: enter image description here

Мой контроллер:

    public function index(Request $request)
    {
      $dumpDb = Dumpdb::query();
      // Search values
      $hw = Dumpdb::select('hw')->distinct()->orderBy('hw', 'asc')->get();
      $pld = Dumpdb::select('hwtype')->distinct()->get();
      $hwtype = Dumpdb::select('hwtype', 'hwtype2')->distinct()->get();
      $kw = Dumpdb::select('kw')->whereNotNull('kw')->distinct()->orderBy('kw', 'asc')->get();
      $engine = Dumpdb::select('enginetype')->distinct()->get();
      $euro = Dumpdb::select('euro')->where('euro', '!=', 'NULL')->distinct()->get();

      // Search filters
      if ($request->has('hw') && $request->input('hw') != '') {
        $dumpDb = $dumpDb->where('hw', '=', $request->input('hw'));
      }

      if ($request->has('pld') && $request->input('pld') != '') {
        $dumpDb = $dumpDb->where(function ($query) use ($request) {
            $query->where('hwtype', $request->input('pld'))
                  ->orWhere('hwtype2', $request->input('pld'));
        });
      }

      if ($request->has('kw') && $request->input('kw') != '') {
        $dumpDb = $dumpDb->where('kw', '=', $request->input('kw'));
      }

      if ($request->has('engine') && $request->input('engine') != '') {
        $dumpDb = $dumpDb->where('enginetype', '=', $request->input('engine'));
      }

      if ($request->has('euro') && $request->input('euro') != '') {
        $dumpDb = $dumpDb->where('euro', '=', $request->input('euro'));
      }

      if ($request->has('ds') && $request->input('ds') != '') {
        $dumpDb = $dumpDb->where('dataset', 'LIKE', '%'. $request->input('ds') .'%');
      }

       // THIS FILTER NOT WORKING CORRECTLY
      if ($request->input('hasPayed') == '1') {
        $downloadHistory = DumpDownloadHistory::query();
        $dumpDb = $downloadHistory->where('user_id', auth()->user()->id)->where('downloadCost', '!=', 'NULL');
      }

      $dumpDb = $dumpDb->orderBy('id', 'desc')->paginate(30);
    return view('dumpDb.index', compact('hw', 'pld', 'kw', 'engine', 'euro', 'dumpDb',  'hwtype'));

Любая помощь будет очень полезно. Заранее спасибо.

1 Ответ

1 голос
/ 28 апреля 2020

Я полагаю, что вы должны включить отношения при получении DumpDb. Laravel предоставляет несколько способов автоматического получения этого:

Стремительная загрузка :

$books = App\Book::with(['author', 'publisher'])->get();

Вы должны загрузить DumpDownloadHistory из запроса DumpDb ($dumpDb->with('dumpDownloadHistory') ). После того, как вы это сделаете, вы можете изменить свой фильтр для запроса соответствующей DumpDownloadHistory путем , ограничивающей активные нагрузки :

$dumpDb = dumpDb->with(['dumpDownloadHistory' => function ($query) {
    $query->where('user_id', auth()->user()->id)->where('downloadCost', '!=', 'NULL');
}]);

Это просто загрузит отношения, если запрос where равен true. Однако вы также можете sh ограничить DumpDb, так что вы можете использовать whereHas:

$posts = App\Post::whereHas('comments', function (Builder $query) {
    $query->where('content', 'like', 'foo%');
})->get();

Это будет загружать модель, только если она имеет определенный тип отношений Таким образом, вы можете использовать его следующим образом:

$dumpDb = $dumpDb->whereHas('dumpDownloadHistory', function ($query) {
    $query->where('user_id', auth()->user()->id)->where('downloadCost', '!=', 'NULL');
});

Обновление


Отредактируйте модель DumpDb для использования этого отношения:

public function DumpDownloadHistory(){
    return $this->hasMany(DumpDownloadHistory::class, 'file_id');
}

Ваш конечный контроллер должен выглядеть так:

// THIS FILTER NOT WORKING CORRECTLY
if ($request->input('hasPayed') == '1') {
    $dumpDb = $dumpDb->whereHas('dumpDownloadHistory', function ($query) {
        $query->where('user_id', auth()->user()->id)->where('downloadCost', '!=', 'NULL');
    });
}

Избавиться от $downloadHistory = DumpDownloadHistory::query();.

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