Laravel Eloquent:关系的多个外键

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)

RouteTrip有其他属性,这是我没有包括在这里赘述.

这在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)

  • 这对急切的加载不起作用,因为在处理关系时$ this-> source_file将为null。 (10认同)