Сначала посмотрите код моей структуры. Мне нужно получить ограниченные предложения для пользовательского автомобиля. У меня есть пакет hardcode 3. Бесплатное использование получено при регистрации. Серебро и золото. Если пользователь подпишется на серебро, увидит 8 предложений, если подпишется на золото, увидит 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('App\Subscription');
}
public function cars(){
return $this->hasMany('App\Car');
}
public function offers(){
return $this->hasMany('App\Offer');
}
Миграция автомобиля:
$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('App\User');
}
public function offer() {
return $this->hasMany('App\Offer');
}
Предлагает миграцию:
$table->increments('id');
$table->integer('price');
$table->unsignedInteger('user_id');
$table->unsignedInteger('car_id');
Модель предложения:
public function car() {
return $this->belongsTo('App\Car');
}
public function user() {
return $this->belongsTo('App\User');
}
Миграция подписки:
$table->increments('id');
$table->string('subscription');
$table->integer('numberOfOffers');
Модель подписки:
public function users(){
return $this->hasMany('App\User');
}
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');
Модель подписки_пользователя:
public function users(){
return $this->belongsToMany('App\User');
}
public function subscriptions() {
return $this->belongsToMany('App\Subscription');
}
Все работает нормально, просто мне нужно получить предложения на машину в ограниченной версии. Ограниченная версия: поле $table->integer('numberOfOffers'); в таблице подписки. У меня может быть проблема с отношением. Я пытаюсь это сделать, но безуспешно:
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);
}






когда вам нужно запустить запрос на отношения, вы должны использовать такой метод:
$offers = Car::where('id', $carId)->with(['offer' => function($query) use ($limit){
return $query->take($limit);
}])->get();
$limit неопределенная переменная? Как определить $limit?
Я имею в виду количество предложений, которое вам нужно, например 5
Я это знаю... Как это получить? Это вопрос. @hoseinz3
изменить function($query){ на function($query) use ($limit){
перед этим запросом вы должны указать количество предложений, которое вы хотите, другим запросом на основе подписок пользователя
@Давит, я изменился
@hoseinz3 hoseinz3 Я вижу ваши изменения, и ваш код также должен работать (проголосуйте за меня)
$limit — это то, что вы показали в своем коде: $subscription->numberOfOffers как вы правильно объяснили? Так что он ожидает, что вы запросите свой лимит и используете его.
@Davit Ваш ответ с добавлением отношения в модельной работе, но я всегда получал 3 предложения.
@Davit, хорошо, твой код работает нормально, просто всегда возвращай мне 3 предложения, всегда. Если пользователь silver return 3 предлагает именно это, это ошибка $car = Car::find($id); if (!$car) { return response()->json([ 'message' => 'Упс, машина не найдена' ]); } $firstSubscription = Auth::user()->subscriptions()->first(); $limit = $firstSubscription->numberOfOffers; $offers = Car::where('id', $id)->with(['offer' => function($query) use ($limit) { $query->take($limit); }])- >получить(); вернуть ответ()->json($offers);
Попробуй это.
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);
}
Неопределенное свойство: Illuminate\Database\Eloquent\Relations\HasMany::$numberOfOffers @paulELI
Обновил, попробуйте с subscriptions() вместо subscriptions_users()
Я обновляюсь, но снова Неопределенное свойство: Illuminate\Database\Eloquent\Relations\HasMany::$numberOfOffers"
Потратьте некоторое время, чтобы прочитать laravel.com/docs/5.8/красноречивые отношения Похоже, что в вашей текущей настройке возникают конфликты в отношении использования и конфигурации отношений. У вашего
Userможет быть несколькоSubscriptions? Если это так, вам нужно будет запросить их самый высокий уровеньSubscription, чтобы это работало так, как вы хотите.