Maison  >  Questions et réponses  >  le corps du texte

Les clés étrangères Laravel ne produisent pas les résultats attendus

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粉924915787P粉924915787175 Il y a quelques jours375

répondre à tous(1)je répondrai

  • P粉378890106

    P粉3788901062024-04-01 13:05:02

    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'));
        }
    }

    répondre
    0
  • Annulerrépondre