Laravel 6

Problème de table dans la base de donnée

Avatar de Pat2010
Pat2010

Context: Je m'exerce à créer un site e-commerce , dans ma base de donnée j'ai une table produit , une table categories et une table produit_category quand j'essai de creer un produit j'obtiens cette erreur :

Facade\Ignition\Exceptions\ViewException
SQLSTATE[42000]: Syntax error or access violation: 1066 Not unique table/alias: 'categories' (SQL: select `categories`.*, `categories`.`product_id` as `pivot_product_id`, `categories`.`category_id` as `pivot_category_id` from `categories` inner join `categories` on `categories`.`id` = `categories`.`category_id` where `categories`.`product_id` is null) (View: /home/olivier/master-ya/vendor/tcg/voyager/resources/views/formfields/relationship.blade.php)

Model Product:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Product extends Model
{
    public function getPrice(){
       $price= $this->Price / 100;

       return number_format( $price, 2,',',' '). '$';
    }

    public function categories(){
        return $this->belongsToMany('\App\Category');
    }
}

Model categories:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Category extends Model
{
    public function products(){
        return $this->belongsToMany('\App\Product');
    }
}


table product_category:

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateCategoryProductTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('category_product', function (Blueprint $table) {
            $table->id();
            $table->unsignedBigInteger('category_id');
            $table->foreign('category_id')->references('id')->on('categories')->onDelete('cascade');
            $table->unsignedBigInteger('product_id');
            $table->foreign('product_id')->references('id')->on('products')->onDelete('cascade');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('category_product');
    }
}

table categorie:


<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateCategoriesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('categories', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('slug'); 
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('categories');
    }
}

table product:

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateProductsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('products', function (Blueprint $table) {
            $table->id();
            $table->string('Title')->unique();
            $table->string('slug')->unique();
            $table->integer('Price');
            $table->string('Etat');
            $table->text('Description');
            $table->string('Adresse');
            $table->string('phone');
            $table->string('Ville');
            $table->string('image');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('products');
    }
}

Avatar de CinquièmeDimension
CinquièmeDimension

Salut,

Peux-tu nous monter le code de ta création ? Voire même aussi tes models...

Avatar de Pat2010
Pat2010

j'ai actualisé la publication

Avatar de bestmomo
bestmomo

Salut,

Apparemment il y a une mauvaise jointure, c'est quoi la requête envoyée ?

Avatar de CinquièmeDimension
CinquièmeDimension

T'as pas de protected $fillable[] dans tes models. Je ne pense pas que ce soit lié mais c'est peut-être préjudiciable. Quand tu parlait de création, je voulais dire la création de ton produit. En tout cas l'erreur parle d'un Select et pas d'un Insert.

Avatar de nash
nash

il faut le nom de la table alias dans ta jointure

public function products(){
        return $this->belongsToMany(Product::class, 'category_product');
    }
    
    public function categories(){
        return $this->belongsToMany(Category::class, 'category_product');
    }

et franchement cette methode dans le model is dirty

public function getPrice(){
       $price= $this->Price / 100;

       return number_format( $price, 2,',',' '). '$';
    }
    
    mais plutot
    
    public function getPriceAttribute($value)
    {
        return number_format( $value?$value/100:0.00, 2,',',' '). '$';
    }

et ton schema product contient un champ Price en int (remarque il y peu etre une raison)

$table->integer('Price');

Vous ne pouvez pas répondre à ce sujet.