Laravel-Fremdschlüssel geben nicht die erwarteten Ergebnisse aus
P粉924915787
P粉924915787 2024-03-31 16:45:38
0
1
493

Ich entwickle eine Laravel 9-Webanwendung, in der ich zwei Tabellen (usersfeedbacks),它们使用名为 username) habe, die durch Fremdschlüssel verbunden sind. Soweit ich weiß, enthalten die Daten auch relevante Informationen Feedback. Mein Problem ist, dass die Benutzerdaten korrekt empfangen werden, aber das gesamte Feedback enthalten ist, anstatt eine Verbindung zu diesem bestimmten Benutzer herzustellen

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

Soweit ich weiß, sollte 0 durch den Benutzernamen des Benutzers ersetzt werden. Stimmt hier etwas nicht?

反馈Model-

class Feedback extends Model
{
    use HasFactory;

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

UserModel-

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

FeedbackControllerDaten abrufen,

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

        dd($userData->feedbacks);

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

users Tisch-

feedback Tisch-

Dies ist die Ausgabe auf dem Blade, wie Sie sehen können, gibt es das gesamte Feedback aus, obwohl ich nur nerigupexs Feedback über Routing angefordert habe.

Wenn Sie mehr Code zur Lösung dieses Problems benötigen, stellen Sie bitte eine Anfrage und ich werde die Frage entsprechend aktualisieren. TIA.

P粉924915787
P粉924915787

Antworte allen(1)
P粉378890106

这样做(仅解决数据加载问题)

1。重构迁移

用户迁移

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

    .... rest of the code
}

反馈迁移

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。重构模型

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

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

3。在反馈控制器中

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'));
    }
}
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage