search

Home  >  Q&A  >  body text

Laravel foreign keys not outputting expected results

I'm developing a Laravel 9 web application with two tables (users and feedbacks) that use a foreign key named username Make a connection. A user can have a lot of feedback. As far as I know, if I get the user's details, the data also contains relevant feedback. My problem is that the user data is being fetched correctly but it comes with all the feedback instead of being connected to that specific user's feedback. Laravel executes such a query.

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

As I understand it, 0 should be replaced with the user's username. Is there something wrong here?

FeedbackModel-

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

FeedbackControllerGet data,

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

        dd($userData->feedbacks);

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

users Table-

feedback Table-

This is the output on the blade, as you can see it outputs all the feedback, even though I only requested nerigupex's feedback using routing.

If you need more code to solve this problem, please make a request and I will update the question accordingly. TIA.

P粉924915787P粉924915787266 days ago506

reply all(1)I'll reply

  • P粉378890106

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

    Do this (only solves data loading issues)

    1. Refactoring and migration

    User migration

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

    Feedback Migration

    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. Refactor model

    //protected $primaryKey = 'username'; --> remove this
    
    public function feedbacks() {
        return $this->hasMany(Feedback::class);
    }

    3. In feedback controller

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

    reply
    0
  • Cancelreply