Kiedy próbuję synchronizować lub dołączyć stronę serwera, nie działa, tutaj moje modele:

Migracja Cuenta:

public function up()
{
    Schema::create('cuentas', function (Blueprint $table) {
        $table->engine = 'InnoDB';

        $table->id();
        $table->string('accountName');
        $table->integer('potencialP');
        $table->integer('potencialR');
        $table->timestamps();

    });
}

Cuenta Model:

class Cuenta extends Model
{
use HasFactory;
protected $fillable = ['id','accountName','potencialP','potencialR'];

public function options(){
    return $this->belongsToMany('App\Models\Option','cuentas_options');
}
}

Opcja migracji:

 public function up() {
        Schema::create('options', function (Blueprint $table) {
            $table->engine = 'InnoDB';
        
        $table->id();
        $table->string('titulo');
        $table->integer('puntos');
        $table->unsignedBigInteger('field_id');
        $table->timestamps();

        $table->foreign('field_id')->references('id')->on('fields');
    });
}

Model opcji:

class Option extends Model
{
use HasFactory;

protected $fillable = ['id'];

public function cuentas(){
    return $this->belongsToMany('App\Models\Cuenta','cuentas_options');
}
}

Migracja Cuentas_option:

public function up()
{
    Schema::create('cuentas_options', function (Blueprint $table) {
        $table->engine = 'InnoDB';
        
        $table->id();
        $table->string('cuenta_id');
        $table->unsignedBigInteger('option_id');
        // $table->timestamps();

        $table->foreign('cuenta_id')->references('id')->on('cuentas');
        $table->foreign('option_id')->references('id')->on('options');
    });
}

MyExampleCode:

$cuenta = Cuenta::find('8963596291');
$option = Option::all()->pluck('id');
$cuenta->options()->sync($option);
return $cuenta;

Zwraca:

SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`potencial_pr`.`cuentas_options`, CONSTRAINT `cuentas_options_cuenta_id_foreign` FOREIGN KEY (`cuenta_id`) REFERENCES `cuentas` (`id`)) (SQL: insert into `cuentas_options` (`cuenta_id`, `option_id`) values (8963596291, 1))

Na moim lokalnym serwerze działa prawidłowo, ale nie w hostingu serwera, czy ktoś może mi pomóc?

Edytuj: Im używając Lavel 8 i zaktualizowano migracje Cuentas_options:

public function up()
    {
    Schema::create('cuentas_options', function (Blueprint $table) {
        $table->engine = 'InnoDB';
        
        $table->id();
        $table->unsignedBigInteger('cuenta_id');
        $table->unsignedBigInteger('option_id');
        // $table->timestamps();

        $table->foreign('cuenta_id')->references('id')->on('cuentas');
        $table->foreign('option_id')->references('id')->on('options');
    });
}

Problem kontynuowany, IM za pomocą 10.4.11-mariadb - mariadb.org Dystrybucja binarna na lokalnym hoście i 5.6.49-CLL-LVE - MySQL Community Server (GPL) na serwerze może być tym problemem?

1
Nico Socorro 15 kwiecień 2021, 20:15

2 odpowiedzi

Najlepsza odpowiedź

Rozwiązałem go, dodając Keytype na modelu Cuentas i Auto_increment = False

1
Dharman 16 kwiecień 2021, 19:55

Problem może być w $table->string('cuenta_id');, ponieważ Tabela {X1}} Stworzyłeś kolumnę jako identyfikator, w zależności od wersji Lavella może być unsigned integer lub

Do kluczy zagranicznych działa prawidłowo, musisz mieć pewność, że związane z kolumnami są exacly te same typy, z tym samym zestawem zestawu i wszystkim, w twoim przypadku, na stole Cuentas utworzyłeś go jako liczbę całkowitą, a później o utworzono klucz całkowitą jako ciąg

Patrz warunki i ograniczenia dla kluczy obcych tutaj https://dev.mysql.com/doc/refman/5.6/pl/create-table-Foreign-keys.html

Prawdopodobnie lokalnie pracujesz z Sqlite, który nie sprawdza poprawności kluczy obcych w prawie każdym przypadku, spróbuj stworzyć środowisko MySQL lokalnie do pracy z tymi samymi aspektami

0
SpaceDogCS 15 kwiecień 2021, 20:09