Я делаю сайт рекламы недвижимости. В приложении пользователям может понравиться или «пометить» свойство. Это создало запись в помеченной таблице с property_id и user_id.

Я хочу проверить, нравится ли пользователю текущее свойство, чтобы оно им не нравилось снова.

Это все на стороне API на данный момент.

Вот мой контроллер

Это создает понравившуюся / помеченную запись.

public function store(Property $property, User $user, Request $request)
    {     
        $starred = StarredProperty::create(['property_id' => $property->id, 'user_id' => $user->id]);

        return $starred;
    }

Это модель помеченного свойства

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;


class StarredProperty extends Model
{
    use SoftDeletes;

    protected $fillable = ['property_id', 'user_id'];
}

Это пользовательская модель со связью для всех помеченных свойств.

<?php

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use App\Property;
use App\StarredProperty;
use Tymon\JWTAuth\Contracts\JWTSubject;


class User extends Authenticatable implements JWTSubject
{
    use Notifiable;

    protected $fillable = [
        'first_name', 'last_name', 'username', 'email', 'phone_number', 'password',
    ];

    protected $hidden = [
        'password', 'remember_token',
    ];

    protected $casts = [
        'email_verified_at' => 'datetime',
    ];

    public function properties()
    {
        return $this->hasMany(Property::class);
    }

    public function starredProperties()
    {
        return $this->hasMany(StarredProperty::class);
    }


    public function getJWTIdentifier()
    {
        return $this->getKey();
    }


    public function getJWTCustomClaims()
    {
        return [];
    }
}
3
user11341032 18 Апр 2019 в 14:58

2 ответа

Лучший ответ

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

public function store(Property $property, User $user, Request $request)
{
    if (! $user->starredProperties()->where('property_id', $property->id)->exists()) {
        $starred = StarredProperty::create(['property_id' => $property->id, 'user_id' => $user->id]);

        return $starred;
   }

   // Return whatever else you want here if they have already starred the property
}
4
George Hanson 18 Апр 2019 в 12:11

В вашем контроллере для помеченного свойства вы можете использовать метод firstOrcreate вместо create, как упомянуто в документе Laravel.

красноречивые # другие порождения -методы

1
Surender Singh Rawat 18 Апр 2019 в 12:13