Les clés étrangères Laravel ne produisent pas les résultats attendus
P粉924915787
P粉924915787 2024-03-31 16:45:38
0
1
500

Je développe une application Web Laravel 9 dans laquelle j'ai deux tables (usersfeedbacks),它们使用名为 username) jointes par des clés étrangères. .Mon problème est que les données utilisateur sont correctement obtenues, mais elles sont accompagnées de tous les commentaires au lieu de se connecter à cet utilisateur spécifique

select * from `feedback` where `feedback`.`username` = 0 and `feedback`.`username` is not null

Si je comprends bien, 0 doit être remplacé par le nom d'utilisateur de l'utilisateur. Y a-t-il quelque chose qui ne va pas ici?

反馈Modèle-

class Feedback extends Model
{
    use HasFactory;

    //One single user can have many feedbacks.
    public function user() {
        return $this->belongsTo(User::class);
    }
}

UserModèle-

class User extends Authenticatable
{
    use HasApiTokens, HasFactory, Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array<int, string>
     */
    protected $fillable = [
        'name',
        'username',
        'gender',
        'email',
        'password',
        'is_admin',
    ];

    /**
     * The attributes that should be hidden for serialization.
     *
     * @var array<int, string>
     */
    protected $hidden = [
        'password',
        'remember_token',
        'is_admin',
    ];

    protected $primaryKey = 'username';

    public function feedbacks() {
        return $this->hasMany(Feedback::class, 'username');
    }

    /**
     * The attributes that should be cast.
     *
     * @var array<string, string>
     */
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];
}

create_users_tableMigration-

public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->increments('userId');
            $table->string('name');
            $table->string('username')->unique();
            $table->string('gender');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->boolean('is_admin')->default(0);
            $table->rememberToken();
            $table->timestamps();
        });
    }

create_feedback_tableMigration-

public function up()
    {
        Schema::create('feedback', function (Blueprint $table) {
            $table->increments('feedbackId');
            $table->text('feedback');
            $table->string('username');
            $table->timestamps();
            $table->foreign('username')
                ->references('username')
                ->on('users')
                ->onDelete('cascade');
        });
    }

FeedbackControllerObtenez des données,

class FeedbackController extends Controller
{
    public function giveFeedback($username)
    {
        $userData = User::find($username);

        dd($userData->feedbacks);

        return view('feedback.givefeedback', compact('userData'));
    }
}

usersTableau-

feedbackTableau-

Il s'agit de la sortie sur la lame, comme vous pouvez le voir, elle génère tous les commentaires, même si je n'ai demandé que les commentaires de nerigupex en utilisant le routage.

Si vous avez besoin de plus de code pour résoudre ce problème, veuillez faire une demande et je mettrai à jour la question en conséquence. TIA.

P粉924915787
P粉924915787

répondre à tous(1)
P粉378890106

Faites ceci (résout uniquement le problème de chargement des données)

1. Refactorisation et migration

Migration des utilisateurs

Schema::create('users', function (Blueprint $table) {
    $table->bigIncrements('id'); # change your current primary key to this

    .... rest of the code
}

Migration des commentaires

Schema::create('feedback', function (Blueprint $table) {
    $table->bigIncrements('id'); # change your current primary key to this
    $table->unsignedBigInteger('user_id');
    $table->foreign('user_id')->references('id')->on('users');

    .... rest of the code
}

2. Refactoriser le modèle

//protected $primaryKey = 'username'; --> remove this

public function feedbacks() {
    return $this->hasMany(Feedback::class);
}

3. Dans un contrôleur de feedback

class FeedbackController extends Controller
{
    public function giveFeedback($username)
    {
        $userData = User::with('feedbacks')->where('username', $username)->get();

        dd($userData->feedbacks);

        return view('feedback.givefeedback', compact('userData'));
    }
}
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal