Laravel фильтрация данных из отношений - PullRequest
1 голос
/ 28 марта 2020

У меня есть две модели: User и DumpDownloadHistory. DumpDownloadHistory хранит историю всех зарегистрированных пользователей. Отношения между пользователем и DumpDownloadHistory - это OneToMany. DumpDownloadHistory хранит:

  1. user_id (пользователь, который загрузил id),
  2. набор данных (имя файла),
  3. user_ip (ip-адрес операции),
  4. downloadCost (сколько токенов стоило скачать этот файл).

Мне нужно найти историю загрузок из входных данных фильтра. Например, найдите мне всю историю загрузок, чья электронная почта: 'email@email.com'.

Me код:

  public function history(Request $request)
    {
        $downloadHistory = DumpDownloadHistory::query();

        if ($request->has('email') && $request->input('email') != '') {
          // Find all download history related to this email
        }
        if ($request->has('dataset') && $request->input('dataset') != '') {
          $downloadHistory = $downloadHistory->where('dataset', 'LIKE', '%'. $request->input('dataset') .'%');

        }

        if ($request->has('date_from') && $request->input('date_from') != '' && $request->has('date_to') && $request->input('date_to') != '') {
            $datefrom = $request->input('date_from');
            $dateto = $request->input('date_to');
            $downloadHistory = $downloadHistory->wherebetween('created_at', [$datefrom, $dateto]);
        }

        if ($request->input('hasPayed') == '1') {
          $downloadHistory = $downloadHistory->where('downloadCost', '!=', 'NULL');
        }

        $downloadHistory = $downloadHistory->get();

        return view('dumpDb.history', compact('downloadHistory'));
    }

Модель пользователя:

class User extends Authenticatable
{
    use Notifiable;

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

Модель DumpDownloadHistory :

class DumpDownloadHistory extends Model
{

  protected $fillable = ['dataset', 'user_ip', 'downloadCost'];

  public function user(){
    return $this->belongsTo(User::class);
  }
}

1 Ответ

1 голос
/ 28 марта 2020

Это должно сделать это:

if ($request->has('email') && $email = $request->input('email') !== '') {
    $downloadHistory->whereHas('user', function (Builder $query) use ($email) {
        $query->where('email', $email)
    });
}

Взгляните на документы, чтобы узнать больше о запросе существования отношений .

...