#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 не более одного спонсора.