[PROMOÇÃO] Assine com + 30% de desconto ANUAL MENSAL (últimas horas)
Jean Silva
Criador Jean Silva 19/08/2022

Olá Professor, boa tarde!

Tudo bem?

Poderia me ajudar por favor?.

Estou em um novo projeto, e quero dessa vez automatizar os meus testes a cada nova rota de api criada, portanto nesse projeto estou usando Sanctum para autenticação e geração do Token conforme suas aulas anteriores, contudo por algum motivo ao passar o model para o factory e usar o seed ou o unitytest, ambos não conseguem encontrar o USER_ID.

Ele informa que estou inserindo NULO no campo, certo, portanto como faço para pegar esse id de usuário já que não vou logar ou autenticar?.

ERRO

cannot insert NULL into ("GATEWAY_WEB"."COMPANIES"."USER_ID")

Position      : 135

Statement     : insert into "COMPANIES" ("NAME", "CNPJ", "ADDRESS", "DESCRIPTION", "USER_ID", "UPDATED_AT", "CREATED_AT")

Migration:

  public function up()
    {
        Schema::create('companies', function (Blueprint $table) {
            $table->id();
            $table->string('name', 255)->unique();
            $table->string('cnpj', 18)->unique();
            $table->string('description', 255);
            $table->string('address', 255);
            $table->boolean('status')->default(true);
            $table->string('user_id', 128);
            $table->timestamps();
            $table->softDeletes();
        });
    }

Classe Factory:

 protected $model = Company::class;

    public function definition()
    {
        $faker = \Faker\Factory::create('pt_BR');

        return[
            'name' => $this->faker->name,
            'cnpj' => $faker ->cnpj,
            'address' => $this->faker->address,
            'description' => $this->faker->text,
            // 'status' => $this->faker->text,
        ];
    }

Seeder

    public function run()
    {
        Company::factory()->count(20)->create();
    }

 

 

 

 

Manager Carlos Ferreira 19/08/2022

Olá, Jean!
Tudo bem?

Ajudo sim, claro.

Como a coluna user_id não é um valor null:
$table->string('user_id', 128)->nullable();

Precisa gerar um User para relacionar essa factory:
'user_id' => User::factory(),

https://github.com/especializati/curso-laravel-9-dashboard-ead/blob/main/database/factories/LessonFactory.php#L25

Pegou a ideia?

Carlos Ferreira
Criador Jean Silva 19/08/2022

Olá professor, bom dia!

Deu certo, obrigado.

 

Vlwww.

Jean Silva
Criador Jean Silva 19/08/2022

Professor, boa tarde!

Uma outra dúvida, têm alguma forma mais fácil no laravel de que toda vez quando algum usuário atualizar, deletar, atualize o user_id?.

Ex:

Tenho uma tabela de VehicleTypes, aonde tenho um user_id, ao inserir um novo dado, o laravel através do sanctum, consegue pegar o id autenticado, portanto quando vou fazer um update nesse mesmo dado, com outro user, ele não atualiza, para efetuar essa proeza, tive que realizar da seguinte maneira, pegando o auth autenticado, jogando para o resource, no vuejs pego o data e coloco no input com hidden e passo no v-model o user_id e salvo, funciona, portanto gostaria de verificar outros jeitos, se possivel, grato.

 

VehicleTypeController

 public function update(UpdateVehicleTypeRequest $request, VehicleType $vehicleType)
    {
        $this->authorize('update', $vehicleType);
        $vehicleType->update($request->validated());
        return new VehicleTypeResource($vehicleType);
    }

Laravel em VehicleTypeResource

   $useLogged = Auth::user()->id;

        return[
            'id' => $this->id,
            'type' => $this->type,
            'description' => $this->description,
            'user_id' => $this->whenNotNull($useLogged),
            'user_name' => Auth::user()->username,
            // 'user_logged' => Auth::user()->id,
            'created_at' => $this->created_at->format('d-m-Y H:i:s'),
            'updated_at' => $this->updated_at->format('d-m-Y H:i:s'),
            'deleted_at' => $this->updated_at->format('d-m-Y H:i:s'),
        ];

UpdateVehicleTypeRequest

public function rules()
    {
        return [
            'type' => ['required','unique:vehicle_types','max:50'],
            'description' => ['required', 'max:255'],
            'user_id' => ['required', 'max:128']
        ];

Model VehichleType

class VehicleType extends Model
{
    use HasApiTokens, HasFactory, Notifiable, UserTenant, SoftDeletes;

    protected $fillable = [
        'type', 'description', 'user_id'
    ];

    protected $dates = ['deleted_at'];
}

VUEJS

                        <div class="mb-3" hidden>
                            <label class="form-label" for="user_id">User Logado</label>
                            <input class="form-control" type="text" id="user_id" placeholder="User" v-model="vehicleType.user_id" required />
                        </div>

 

Jean Silva
Manager Carlos Ferreira 19/08/2022

Olá, Jean!
Tudo bem?

Esse user_id vem do seu client?
Esse valor pode ser "falso"

Ainda que você valide que seja um valor que realmente exista no banco, ainda pode ser um usuário se passando por outro:
'user_id' => ['required', 'max:128', 'exists:users,id']

Por que não consegue pegar do usuário autenticado?
Porque se essa operação foi a partir de algum usuário identificado (tem o user_id) é porque esse usuário está autenticado de alguma forma.

Carlos Ferreira
Criador Jean Silva 19/08/2022

Perfeito, grato.

Jean Silva
Sabe a Solução? Ajude a resolver!

Precisa estar logado para conseguir responder a este ticket!

Clique Aqui Para Entrar!