Gen*_*liu 9 laravel eloquent laravel-eloquent
我正在将项目移植到Laravel.
我有两个数据库表,彼此之间处于一对多关系.它们有三个条件.如何在Eloquent中建立这种关系模型?
我不应该修改数据库模式,因为它必须保持向后兼容其他东西.
我尝试了以下,但它不起作用.
拥有方:
use Illuminate\Database\Eloquent\Model;
class Route extends Model
{
public function trips()
{
return $this->hasMany('Trip', 'route_name,source_file', 'route_name,source_file')
}
}
Run Code Online (Sandbox Code Playgroud)
反面:
use Illuminate\Database\Eloquent\Model;
class Trip extends Model
{
public function routes()
{
return $this->belongsTo('Route', 'route_name,source_file', 'route_name,source_file');
}
}
Run Code Online (Sandbox Code Playgroud)
示例Route数据库值:
id | route_name | source_file
---------------------------------------
1 | Berlin - Paris | file1.xls
2 | Madrid - London| file2.xls
3 | Berlin - Paris | file3.xls
Run Code Online (Sandbox Code Playgroud)
示例Trip数据库值:
id | route_name | source_file | duration
---------------------------------------------------------
1 | Berlin - Paris | file1.xls | 78
2 | Madrid - London | file2.xls | 241
3 | Berlin - Paris | file3.xls | 65
1 | Berlin - Paris | file1.xls | 95
1 | Berlin - Paris | file1.xls | 65
Run Code Online (Sandbox Code Playgroud)
Route并Trip有其他属性,这是我没有包括在这里赘述.
这在Eloquent中是否可行?
top*_*udy 16
我不得不处理类似的问题.@fab提供的解决方案不适用于预先加载,因为$ this-> source_fil e 在处理关系时将为null.我想出了这个解决方案
安装Compoship并在模型中进行配置后,您可以定义与多个列匹配的关系.
拥有方:
use Illuminate\Database\Eloquent\Model;
use Awobaz\Compoships\Compoships;
class Route extends Model
{
use Compoships;
public function trips()
{
return $this->hasMany('Trip', ['id', 'route_name', 'source_file'], ['route_id', 'route_name', 'source_file']);
}
}
Run Code Online (Sandbox Code Playgroud)
反面:
use Illuminate\Database\Eloquent\Model;
use Awobaz\Compoships\Compoships;
class Trip extends Model
{
use Compoships;
public function route()
{
return $this->belongsTo('Route', ['route_id', 'route_name', 'source_file'], ['id', 'route_name', 'source_file']);
}
}
Run Code Online (Sandbox Code Playgroud)
Compoships支持急切加载.
小智 5
如Jonathon所述,您可以尝试where在您的关系中添加- 子句:
use Illuminate\Database\Eloquent\Model;
class Route extends Model
{
public function trips()
{
return $this->hasMany('Trip', 'route_name')->where('source_file', $this->source_file);
}
}
Run Code Online (Sandbox Code Playgroud)
反面:
use Illuminate\Database\Eloquent\Model;
class Trip extends Model
{
public function routes()
{
return $this->belongsTo('Route', 'route_name')->where('source_file', $this->source_file);
}
}
Run Code Online (Sandbox Code Playgroud)