#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»