Laravel Eloquent:关系的多个外键

时间:2018-01-03 12:57:34

标签: 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')
    }
}

反面:

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

RouteTrip还有其他属性,为简洁起见,我未在此处包含这些属性。

这在Eloquent中是否可行?

3 个答案:

答案 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被修改为不再相关,如果任何人需要类似答案

,则保留