【问题标题】:How to get all data from two related tables in Laravel [one to many]如何从 Laravel 中的两个相关表中获取所有数据 [一对多]
【发布时间】:2019-07-01 22:18:06
【问题描述】:

我是 Laravel 的新手,需要编写一个简单的后端 API。 我做错了,我不知道是什么,因为我从供应商表和空数组 payments:[] 中获取了一些数据。

我正在尝试从两个相关表 - PAYMENTS 和 SUPPLIERS 中获取所有数据。 PAYMENTS 表中的 SUPPLIERS_ID 与 SUPPLIERS 中的 ID 是一对多的关系。这里我给你一个图形表示:

这是我的代码:

Suppliers.php 模型

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Suppliers extends Model
{
   public function payments()
   {
      return $this->hasMany('App\Payments'); 
   }
}

Payments.php 模型

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Payments extends Model
{
   public function suppliers()
   {
      return $this->hasOne('App\Suppliers'); 
  }
}

PaymentsController.php

use App\Payments;
use App\Suppliers;
use Illuminate\Http\Request;
use Illuminate\Http\Response;

class PaymentsController extends Controller
{

public function index()
   {    
      $payments = Suppliers::with('payments')->get();
      return response($payments, Response::HTTP_OK);
   }
}

我得到以下答案:

[{"id":1,"name":"Ekonaft","adress":"33-100 Tarnow ","email":"ekonaft@gmail.com","payments":[]}, 
{"id":2,"name":"Orlen","adress":"Ares testowy","email":"email@email.pl","payments":[]}]

我做错了什么,我在每个对象的末尾得到一个空数组 payments:[ ]

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    尝试付款的反比关系

    belongsTo = has a foreign key to another table
    

    举个例子

    Should i use belongsTo or hasOne in Laravel?

    这是您从 Payments 访问供应商的方式

    <?php
    
    namespace App;
    
    use Illuminate\Database\Eloquent\Model;
    
    class Payments extends Model
    {
       public function suppliers()
       {
          return $this->belongsTo('App\Suppliers'); 
      }
    }
    

    这是来自供应商的付款

    <?php
    
    namespace App;
    
    use Illuminate\Database\Eloquent\Model;
    
    class Suppliers extends Model
    {
       public function payments()
       {
          return $this->hasMany('App\Payments','suppliers_ID','id'); 
       }
    }
    

    另外,确保 id 在输出中可见(如果 id 被隐藏,laravel 无法处理该关系)。如果要使用hasOne,也可以指定关系上的键

    编辑:在关系中添加键名,你的 fk 命名是大写的

    【讨论】:

      【解决方案2】:

      像贝尔一样改变你的关系

      Suppliers.php 模型

      <?php
      
      namespace App;
      
      use Illuminate\Database\Eloquent\Model;
      
      class Suppliers extends Model
      {
         public function payments()
         {
            return $this->hasMany(App\Payments::class, 'suppliers_ID', 'id'); 
         }
      }
      

      Payments.php 模型

      <?php
      
      namespace App;
      
      use Illuminate\Database\Eloquent\Model;
      
      class Payments extends Model
      {
         public function suppliers()
         {
            return $this->belongsTo(App\Suppliers::class, 'suppliers_ID', 'id'); 
        }
      }
      

      然后再试一次..... :)

      【讨论】:

        【解决方案3】:

        由于表关系键名不匹配,您将获得 payments:[] 的空数组。

        Please, make few changes in both relational function.
        
        public function payments() 
        {
        
            //return $this->hasMany('App\Model', 'foreign_key', 'local_key');
            return $this->hasMany('App\Payments', 'suppliers_id'); 
        
        }
        
        public function suppliers()
        {
        
            //return $this->belongsTo('App\Model', 'foreign_key', 'other_key');
            return $this->belongsTo('App\Suppliers', 'suppliers_id'); 
        
        }
        

        您可以直接从 Laravel 文档中了解更多关于 eloquent 关系的信息,以便更好地理解。 https://laravel.com/docs/5.7/eloquent-relationships#one-to-many

        如果您仍然遇到同样的错误,请告诉我。

        【讨论】:

        • 现在,它工作正常。非常感谢。但是你能帮我修改我的查询吗?我想获得一点不同的结果。现在我有来自 SUPPLIERS 和 PAYMENTS 的所有记录。如何从 PAYMENTS 中读取所有记录并获取供应商名称而不是 SUPPLIERS_ID。
        • 你的查询就像是得到一个至少有一笔付款的供应商: $payments = Suppliers::whereHas('payments')->with('payments')->get() ;
        • 要从 PAYMENTS 中读取所有记录并获取供应商名称而不是 SUPPLIERS_ID,您可以使用反向关系。 $payments = Payments::with('suppliers')->get();
        • 非常感谢!你拯救了我的夜晚。
        • 欢迎@obaram
        猜你喜欢
        • 2014-01-26
        • 2019-02-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多