我有项目模型和合同模型。当我执行Project:all()时,它只给我没有合同的项目,合同也是如此。我试着在合约内部调用dd(),但没有做任何事情,就像从未执行过一样。我还尝试了App' prefix和不带。
use Illuminate'Database'Eloquent'Model;
class Project extends Model
{
protected $table = 'project';
public function contract() {
return $this->belongsTo('Contract');
}
}
namespace App;
use Illuminate'Database'Eloquent'Model;
class Contract extends Model
{
protected $table = 'contract';
public function project() {
return $this->hasMany('Project', 'ContractID', 'ContractID');
}
}
我试着像这样检索它们:
$projects = Project::all()->take(10);
你这里有几个问题。
- 项目::所有()-> (10);
这只返回一个项目集合。你还没有明确说你也想要合同呢。
$projects = Project::with('contract')->get();
在你的
belongsTo
-你没有指定表应该连接的列。您需要这样做,因为您没有使用标准的id
作为主键,contract_id
作为外键。与具体问题无关,但你们在合同模型中的关系也是错误的。
public function project() { return $this->hasMany('Project', 'ContractID', 'ContractID'); }
- 最后-为什么使用非标准的表/列命名约定?
contract_id
怎么了?你知道mysql是不区分大小写的吗?此外,project
表可以重命名为projects
,contract
表可以重命名为contracts
。这将使你写你的雄辩的关系更容易,更有意义!
如果一个合同有多个项目,那么你的public function project()
应该是public function projects()
;
如果您使用标准的命名约定,那么您可以这样声明您的模型关系。
namespace App;
use Illuminate'Database'Eloquent'Model;
class Contract extends Model
{
public function projects() {
return $this->hasMany('Project');
}
}
请注意,您不需要在模型中指定表名,也不需要指定表与项目的关系。