Получить автомобиль с ограниченными предложениями Laravel

#php #mysql #laravel #eloquent

#php #mysql #laravel #красноречивый

Вопрос:

Сначала посмотрите на мою структуру кода. Мне нужно получить ограниченные предложения для пользовательского автомобиля. У меня есть пакет hardcode 3. Бесплатное использование предоставляется при регистрации. Серебро и золото. Если пользователь подпишется на silver, то увидит 8 предложений, если подпишется на gold, то увидит 15 предложений. Если нет подписки, смотрите 2 предложения (бесплатный пакет). Мой код:

Миграция пользователей:

         $table->increments('id');
        $table->string('name');
        $table->string('email')->unique();
        $table->timestamp('email_verified_at')->nullable();
        $table->string('password');
        $table->rememberToken();
        $table->timestamps();
  

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

 public function subscriptions_users(){
    return $this->hasMany('AppSubscription');
}
public function cars(){
    return $this->hasMany('AppCar');
}
public function offers(){
    return $this->hasMany('AppOffer');
}
  

Миграция автомобиля:

  $table->bigIncrements('id');
        $table->string('car_type');
        $table->string('mark');
        $table->string('model');
        $table->unsignedInteger('user_id');
        $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
  

Модель автомобиля:

 public function images() {
    return $this->hasMany(CarImages::class);
}
public function user() {
    return $this->belongsTo('AppUser');
}
public function offer() {
    return $this->hasMany('AppOffer');
}
  

Миграция предложений:

         $table->increments('id');
        $table->integer('price');
        $table->unsignedInteger('user_id');
        $table->unsignedInteger('car_id');
  

Предлагаемая модель:

 public function car() {
    return $this->belongsTo('AppCar');
}
public function user() {
    return $this->belongsTo('AppUser');
}
  

Миграция подписки:

         $table->increments('id');
        $table->string('subscription');
        $table->integer('numberOfOffers');
  

Модель подписки:

 public function users(){
    return $this->hasMany('AppUser');
}
  

Subscription_user (сводная таблица с пользователем и подпиской):

         $table->increments('id');
        $table->integer('user_id')->unsigned()->index();
        $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); //foreign key relation
        $table->integer('subscription_id')->unsigned()->index();
        $table->foreign('subscription_id')->references('id')->on('subscriptions')->onDelete('cascade'); 
  

Модель Subscription_user:

 public function users(){
    return $this->belongsToMany('AppUser');
}

public function subscriptions() {
    return  $this->belongsToMany('AppSubscription');
}
  

Думаю, все работает нормально, просто мне нужно получить предложения на автомобиль в ограниченной версии. Ограниченная версия — это поле $table->integer(‘Количество предложений’); в таблице подписки.Возможно, у меня проблема с отношением..Я пробую это, но безуспешно:

 public function getOffers($carID) {
$car = Car::find($carID);
$offers = $car->offer()->limit(THIS IS PROBLEM I DON'T KNOW HOT TO CONNECT USER WITH numberOfOffers)->get();
 return response()->json($offers);
}
  

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

1. Уделите некоторое время чтению laravel.com/docs/5.8/eloquent-relationships Похоже, что в вашей текущей настройке возникают конфликты при использовании отношений и конфигурации. У вас User может быть несколько Subscriptions ? Если это так, вам нужно будет запросить их самый высокий уровень Subscription , чтобы заставить это работать так, как вы хотите.

Ответ №1:

когда вам нужно выполнить запрос по взаимосвязи, вы должны использовать метод with, подобный этому:

 $offers = Car::where('id', $carId)->with(['offer' => function($query) use ($limit){
    return $query->take($limit);
}])->get();
  

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

1. $limit — это неопределенная переменная? Как определить $limit?

2. Я имею в виду количество предложений, которое вам нужно, например 5

3. Я это знаю… Как это получить? Это вопрос. @hoseinz3

4. измените function($query){ на function($query) use ($limit){

5. перед этим запросом вы должны указать количество предложений, которое вы хотите, с помощью другого запроса, основанного на подписках пользователя

Ответ №2:

Попробуйте это.

 public function getOffers($carID) {
    if (!$subscriptionTierLimit = Auth::user()->subscriptions()->numberOfOffers) {
        return Redirect::to('/login'); //You can do whatever redirect here.
    }

    $car = Car::find($carID);
    $offers = $car->offer()->limit(subscriptionTierLimit)->get();

    return response()->json($offers);
}
  

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

1. Неопределенное свойство: IlluminateDatabase EloquentRelations hasMany::$numberOfOffers @paulELI

2. Обновил его, попробуйте с subscriptions() вместо subscriptions_users()

3. Я обновляю, но снова неопределенное свойство: Illuminate Database Eloquent Relations hasMany::$numberOfOffers»