【问题标题】:Laravel 5.3: hasManyThrough relationshipLaravel 5.3:hasManyThrough 关系
【发布时间】:2016-09-02 09:38:18
【问题描述】:

我有以下情况:

location
  id - integer
  network_id - integer (FK)

network
  id - integer
  owner_id - integer (FK)

owner
  id - integer
  name - string

我的位置数据有一个 Eloquent 模型。现在我想做的是创建一个 RESTful API,我可以在其中通过网络模型检索所有者数据。

我尝试过使用hasManyThrough,但没有成功。该模型具有以下关系;

Network - Location = One to Many
Owner - network = One to One

这么多位置属于一个网络,每个网络都有一个所有者。情况总是如此。

我尝试了以下方法。

class Location extends Model 
{
    public function owner() {
       return $this->hasManyThrough('App\Owner', 'App\Network, 'id', 'id);
    }
}

然后在我的资源中返回模型。

class LocationController extends Controller 
{
   public function index() {
      return [
         'data' => Location::with('network', 'owner')->take($limit)->take($offset)->get()
      ];
   }
}

我没有收到错误,但模型没有返回任何所有者,而只是一个空数组。

谁能帮助我使用 Laravel 的 Eloquent 在这些模型之间建立关系?我正在使用 Laravel 5.3。

【问题讨论】:

  • 请告诉我们您尝试了什么以及出现了什么问题。

标签: php laravel model eloquent laravel-5.3


【解决方案1】:

不确定您的表结构是否适合使用 hasManyThrough

根据我所看到的您需要的文档

location
  id - integer
  network_id - integer

network
  id - integer
  location_id - integer

owner
  id - integer
  network_id - integer
  name - string

那么你可以使用

 return $this->hasManyThrough(
            'App\Owner', 'App\Network',
            'location_id', 'network_id', 'id'
        );

话虽如此,您可以通过尝试不同的组合来使其工作,例如 hasManyThrough

return $this->hasManyThrough('App\Owner', 'App\Network, 'owner_id', 'id', 'network_id');

【讨论】:

    【解决方案2】:

    与下面的代码绑定关系

    class Location extends Model
    {
     public function network()
     {
        return $this->hasMany('App\Network');
     }
    }
    
    
    class Network extends Model
    {
    
     public function owner()
     {
        return $this->hasOne('App\Owner');
     }
    }
    

    它解决了你的问题...

    【讨论】:

      【解决方案3】:

      所有者模型:

      <?php
      
      namespace App;
      
      use Illuminate\Database\Eloquent\Model;
      
      class Owner extends Model
      {    
      
          public function get_data()
          {
              return $this->belongsToMany('App\Location','App\Network');
          }  
      
      }
      

      调用模型:

      <?php
      
      $data=Owner::find(1)->get_data()->select('network_id','location_id')->get();
      

      => 获取网络和位置表数据以使用选择选项

      【讨论】:

        猜你喜欢
        • 2018-10-18
        • 2023-03-09
        • 2018-07-24
        • 2020-10-14
        • 1970-01-01
        • 2018-03-08
        • 2021-12-06
        • 2023-03-08
        • 2017-02-07
        相关资源
        最近更新 更多