在Laravel 5.1中获取嵌套的关联记录


Get nested associated records in Laravel 5.1

我有三个数据库表

CREATE TABLE `tblprojecttype` (
  `ProjectTypeID` int(11) NOT NULL,
  `ProjectType` varchar(30) NOT NULL,
  `Description` varchar(500) NOT NULL,
  `IsActive` tinyint(1) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE `tblprojecttypecurrencyprice` (
  `ProjectTypeCurrencyID` int(11) NOT NULL,
  `CurrencyID` int(11) NOT NULL,
  `ProjectTypeID` int(11) NOT NULL,
  `Price` decimal(10,0) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE `tblcurrency` (
  `CurrencyID` int(11) NOT NULL,
  `Currency` varchar(100) NOT NULL,
  `IsActive` tinyint(1) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

型号

class Currency_Model extends Model
{
    protected $table = "tblcurrency";
    protected $primaryKey = "CurrencyID";
    public $timestamps = false;
}
class ProjectType_Model extends Model
{
    protected $table = "tblprojecttype";
    protected $primaryKey = "ProjectTypeID";
    public $timestamps = false;
    public function projecttypecurrencyprice()
    {
         return $this->hasOne(''App'Models'ProjectTypeCurrencyPrice_Model', 
                                                     "ProjectTypeID");
    }
}
class ProjectTypeCurrencyPrice_Model extends Model
{
    protected $table = "tblprojecttypecurrencyprice";
    protected $primaryKey = "ProjectTypeCurrencyID";
    public $timestamps = false;
    public function Currency()
    {
         return $this->hasOne(''App'Models'Currency_Model', "CurrencyID");
    }
}

存在CurrencyID关系和ProjectTypeID关系

我在尝试什么

在我的Laravel 5.1代码中,我试图实现下面的sql语句,这样我就可以为每个ProjectType record获得projecttypecurrencyprice records。最后,它还应该为每个projecttypecurrencyprice记录显示来自currency Table的记录

$ProjectTypes = 'App'Models'project'ProjectType'ProjectType_Model
                ::with("projecttypecurrencyprice")
                ->with("projecttypecurrencyprice.Currency")
                ->get();

问题出在哪里

我无法获取每个项目的货币记录类型货币价格记录。

对于ProjectTypeCurrencyPrice_Model,您应该以这种方式更改Currency关系:

public function Currency()
{
     return $this->belongsTo(''App'Models'Currency_Model', "CurrencyID");
}

因为在tblprojecttypecurrencyprice中有CurrencyId列,而在tblcurrency中没有与ProjectTypeCurrencyPrice_Model的任何连接。获取数据而不是:

$ProjectTypes = 'App'Models'project'ProjectType'ProjectType_Model
                ::with("projecttypecurrencyprice")
                ->with("projecttypecurrencyprice.Currency")
                ->get();

可以省略第一个with:

$ProjectTypes = 'App'Models'project'ProjectType'ProjectType_Model
                ::with("projecttypecurrencyprice.Currency")
                ->get();

顺便说一句,如果你开始这个项目,你应该考虑数据库结构的变化,并阅读PHP中的PSR——如果你真的不必使用ProjectTypeCurrencyPrice_Model作为你的模型名称,MySQL 中的ProjectTypeID列也是如此