我正在将项目移植到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')
}
}
反面:
use Illuminate\Database\Eloquent\Model;
class Trip extends Model
{
public function routes()
{
return $this->belongsTo('Route', 'route_name,source_file', 'route_name,source_file');
}
}
示例Route
数据库值:
id | route_name | source_file
---------------------------------------
1 | Berlin - Paris | file1.xls
2 | Madrid - London| file2.xls
3 | Berlin - Paris | file3.xls
示例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
Route
和Trip
还有其他属性,为简洁起见,我未在此处包含这些属性。
这在Eloquent中是否可行?
答案 0 :(得分:11)
我不得不处理类似的问题。 @fab提供的解决方案不适用于预先加载,因为 $ this-> source_fil e在处理关系时将 null 。我想出了this solution
安装Compoships并在模型中进行配置后,您可以定义匹配多个列的关系。
拥有方:
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']);
}
}
反面:
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']);
}
}
Compoships支持急切加载。
答案 1 :(得分:4)
已经提及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);
}
}
反面:
use Illuminate\Database\Eloquent\Model;
class Trip extends Model
{
public function routes()
{
return $this->belongsTo('Route', 'route_name')->where('source_file', $this->source_file);
}
}
答案 2 :(得分:1)
我如何解决这个问题就是做这样的事情
class A
{
public function b1()
{
return $this->hasMany('B', 'prop1', 'prop1')
}
public function b2()
{
return $this->hasMany('B', 'prop2', 'prop2')
}
public function b3()
{
return $this->hasMany('B', 'prop3', 'prop3')
}
public function getBsAttribute()
{
$data = collect([$this->b1, $this->b2, $this->b3]);
return $data->unique();
}
}
收集所有单个关系并将它们作为唯一集合返回,并且显然对反向做同样的事情,这应该会为您提供一些数据。
OP被修改为不再相关,如果任何人需要类似答案
,则保留