代码之家  ›  专栏  ›  技术社区  ›  DolDurma

挽救关系后拉威尔得到错误的关系结果

  •  1
  • DolDurma  · 技术社区  · 6 年前

    在我的web应用程序中,有两个表 users paymants 使用此型号:

    class User extends Authenticatable
    {
        use Notifiable;
        protected $guarded = [
            'id'
        ];
    
        public function payments()
        {
            return $this->hasMany(Payment::class);
        }
    }
    
    class Payments extends Model
    {
        protected $table = 'payments';
        protected $guarded = ['id'];
    
        public function users()
        {
            return $this->belongsTo(User::class);
        }
    }
    

    每个用户都有许多付款记录,每个付款都属于一个用户,现在我使用finding user创建简单的付款记录

    $user = User::find(2);
    
    $user->payments()->create(
        [
            'resnumber' => 'dwwe',
            'price' => '1111',
            'invoice_id' =>'asdasd',
            'month_key' => 'k8Cv2YfuO4jOLXd',
            'month_id' => 6,
            'payment' => false
        ]
    );
    

    此代码工作正常,可以创建成功的付款记录,现在我要获取此已保存的带有关系的记录,例如:

    $data = $user::with(['payments'])->first();
    

    结果为空:

      #relations: array:2 [▼
        "payments" => Collection {#367 ▼
          #items: []
        }
    

    完整测试代码:

    Route::get('/testPayment', function () {
        $user = User::find(2);
    
        $user->payments()->create(
            [
                'resnumber' => 'dwwe',
                'price' => '1111',
                'invoice_id' =>'asdasd',
                'month_key' => 'k8Cv2YfuO4jOLXd',
                'month_id' => 6,
                'payment' => false
            ]
        );
    
        $data = $user::with(['payments'])->first();
        dd($data);
    });
    

    迁移代码:

    public function up()
    {
        Schema::create('payments', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('user_id')->unsigned();
            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
            $table->integer('month_id')->unsigned();
            $table->foreign('month_id')->references('id')->on('months')->onDelete('cascade');
            $table->string('month_key');
            $table->string('resnumber');
            $table->string('invoice_id');
            $table->string('price');
            $table->boolean('payment')->default(false);
            $table->string('card_holder')->nullable();
            $table->string('result_code')->default(0);
            $table->timestamps();
        });
    }
    

    现在有了 大问题

    在mysql数据库中更改用户id值后,例如 2 1 我有这个结果:|

      #relations: array:2 [▼
        "payments" => Collection {#378 ▼
          #items: array:1 [▼
            0 => Payment {#375 ▶}
          ]
    

    此付款记录不适用于ID为的用户

    1 回复  |  直到 6 年前
        1
  •  0
  •   sam    6 年前

    您正在创建一个新的用户查询,该查询返回了错误的用户。

    $user = User::find(2);
    
    $user->payments()->create(
        [
            'resnumber' => 'dwwe',
            'price' => '1111',
            'invoice_id' =>'asdasd',
            'month_key' => 'k8Cv2YfuO4jOLXd',
            'month_id' => 6,
            'payment' => false
        ]
    );
    
    $data = $user::with(['payments'])->first();
    dd($data);
    
    1. 你找到了 User 身份证号码 2
    2. 您为创建付款 User#2
    3. 你查询每一个 用户 急装 payments 然后返回第一个

    这是因为 $user 两者都是 用户 这个 用户 模型。 $user::with 没有 说“为这个$用户获得付款”它说“获得全部” 用户 用他们的钱“,相当于 User::with('payments')->first();

    你已经有了 用户 您对此感兴趣,因此您的代码应该如下所示:

    $user = User::find(2);
    
    $user->payments()->create(
        [
            'resnumber' => 'dwwe',
            'price' => '1111',
            'invoice_id' =>'asdasd',
            'month_key' => 'k8Cv2YfuO4jOLXd',
            'month_id' => 6,
            'payment' => false
        ]
    );
    
    dd($user->payments);