Сбой запроса к базе данных Laravel?

#php #mysql #laravel

#php #mysql #laravel

Вопрос:

У меня есть настройка базы данных, подобная этой:https://imgur.com/a/ECOypAE

Мой код таков

 namespace AppHttpControllers;
use IlluminateHttpRequest;
use AppApartment;
use Auth;
use AppRate;
use Braintree;
use AppSponsorship;
use AppPayment;
use CarbonCarbon;

public function index(Sponsorship $sponsorship)
{
     //definisco la data di scadenza con CARBON
      $current_timestamp = Carbon::now('Europe/Rome')->toDateTimeString();

     //recupero la sponsorizzazione in database più recente, dell'appartamento in oggetto
      $apartment = Apartment::all()->where("id","=", $sponsorship->apartment_id)->where("expiry_date", ">", $current_timestamp);

dd($apartment);
  

Что я хочу сделать, так это показать только квартиры, где идентификатор квартиры равен apartment_id в таблице спонсорства, а также там, где срок спонсорства не истек.

В результате я получаю пустой массив.

Я думаю, что я неправильно строю запрос: есть идеи?

Спасибо

Ответ №1:

Как только вы вызываете all() запрос выполняется и возвращает все результаты в БД.

используйте get() after where() для получения желаемых результатов

 $apartment = Apartment::where("id","=", $sponsorship->apartment_id)->where("expiry_date", ">", $current_timestamp)->get();
  

если вы хотите, чтобы что-то работало, попробуйте это

 if ($sponsorship amp;amp; $sponsorship->expiry_date > $current_timestamp ) {
    $apartment = Apartment::find($sponsorship->apartment_id);
} else {
    //no valid sponsorship
    $apartment = null;
}
  

Комментарии:

1. Спасибо за ваш ответ. Я попробовал ваше решение, но получаю ОШИБКУ SQLSTATE: Illuminate Database QueryException SQLSTATE[42S22]: Столбец не найден: 1054 неизвестных столбца ‘expiry_date’ в предложении ‘where’ (SQL: выберите * из, apartments где id значение null и expiry_date > 2020-09-09 13:37:44)

2. @Cronos90 но это не связано с вашим вопросом, вам нужно исправить свой запрос самостоятельно, ответ — это просто КАК это сделать. плюс, почему $sponsorship->apartment_id равно нулю, и если вы получаете квартиру по идентификатору, почему вы фильтруете по дате? и дата истечения срока действия является частью спонсорства, а не квартирой

Ответ №2:

Возможно, вы хотите вот что, вы должны вызвать метод ‘get()’ вместо ‘all()’ в конце метода Channing, а также использовать взаимосвязь для получения такого результата, проверьте приведенный ниже код, есть метод контроллера и метод модели, надеюсь, это поможет вам.

#Метод контроллера

  public function index(Sponsorship $sponsorship)
  {
       $current_timestamp = Carbon::now('Europe/Rome')->toDateTimeString();
       $apartment = Apartment::with('sponsorship')
         ->whereHas('sponsorship',function($query)use($sponsorship,$current_timestamp) {
             $query->where('id',$sponsorship->id)
             ->where('expiry_date','>',$current_timestamp);
         })->get();

    dd($apartment);
  }
  

#Метод модели для взаимосвязи

Модель квартиры

 public function sponsorship()
{
    return $this->hasOne('AppSponsorship', 'apartment_id', 'id');
}
  

Здесь я предполагаю, что ваши модели имеют «Имеет одно отношение», что означает
У Apartment не более одного спонсора.