Php 如何应用与两个id的关系';在拉雷维尔

Php 如何应用与两个id的关系';在拉雷维尔,php,eloquent,laravel-5.3,Php,Eloquent,Laravel 5.3,因此,我有一个名为数据\存储的模型和另一个名为实体\状态 我必须从数据存储和实体状态获取记录,其中实体状态具有数据存储id和状态id 我怎样才能用雄辩来达到这个目的 或者我必须使用查询生成器和innerJoin 更新1 我的实际问题 $this->values['new_leads'] = $data_storages->with('actions','states','sla')->where('wf_id',$wfid)->get(); 我的数据存储模式 class

因此,我有一个名为
数据\存储
的模型和另一个名为
实体\状态

我必须从
数据存储
实体状态
获取记录,其中实体状态具有
数据存储id
状态id

我怎样才能用雄辩来达到这个目的

或者我必须使用查询生成器和innerJoin

更新1

我的实际问题

$this->values['new_leads'] = $data_storages->with('actions','states','sla')->where('wf_id',$wfid)->get();
我的
数据存储
模式

class data_storages extends Model
{
    //
    protected $fillable = ['layout_id','member_id','company_id','team_id','data','status','wf_id'];



    function actions()
    {
        return $this->hasMany('App\Models\ActionDataMaps', 'data_id', 'id' );
    }

    function states()
    {
        return $this->hasOne('App\Models\workflow_states','id','status');
    }

    function sla()
    {
       //Here I have to get those row from entity_states model where , data_storage_id and state_id 
    }
}

感谢使用查询生成器,您可以使用:

DB::table('data_storage')
    ->join('entity_states','data_storage.data_storage_id','=','entity_states.state_id')
    ->get();

为了便于参考,您可以在模型
数据存储
中定义属性/方法
实体状态
,以获取它们:

class data_storage extends Model
{
    public function entity_states()
    {
        return $this->hasMany('App\entity_states','data_storage_id')->where('state_id ','=',$this->table());
    }
}
然后,您可以通过以下方式在实例中访问它们:

$entityStatesOfDataStorage = $yourDataStorageInstance->entity_states;
请参阅此链接:
以下是更合理的方法:

class DataStorage extends Model { 
     public states() {
         return $this->belongsToMany(State::class,"entity_states");
     }
}

class State extends Model {
     public storages() {
         return $this->belongsToMany(DataStorage::class,"entity_states");
     }
}
然后,您可以通过以下方式查看与负载相关的模型:

$storage = DataStorage::with("states")->first();
$storage->states->first()->column_in_related_state;
或通过州政府:

$state = State::with("storages")->first();
$state->storages->first()->column_in_related_storage;
如果透视表中有其他列,则可以在关系中引用它们,例如:

public states() {
    return $this->belongsToMany(State::class)->withPivot("pivot_column");
}

查看@apokryfos上的文档你能建议使用哪种关系吗?我尝试了hasOne,但它只适用于一个IDF。首先,你需要了解你实际拥有的关系<代码>数据存储
是一个模型,
状态
是另一个模型
entity\u states
是一个数据透视表,因此在
data\u storage
states之间有一个多对多的关系,您所说的是两个实体、表、数据存储和状态之间的多对多关系。如果您的数据库架构有另一个结构,您可能需要重新考虑它的结构。@Vikram checkout apokryfos answer.hasMany将不起作用,因为我必须获取那些实体状态,其中数据、存储id和状态id匹配。对不起,我在最初的帖子中没有得到这些。请看我的编辑。我在谷歌上搜索过,所以代码没有经过测试。但它得到了一些积极的反馈。请让我知道,如果它对你有效。我知道这将有效,但我正在寻找雄辩的answer@Vikram对不起,我的错。如果是这样的话,那么dns_nx的答案就是正确的。不,他的答案是错误的,因为关系不是HasManyAlso,所以应该找到一个透视表。谢谢让em修复这个问题changes@apokryfos在我的数据存储表中,状态列被调用,
状态
如果您将
数据存储
状态
直接关联,并通过
实体状态
关联,则这是两种不同的关系。此代码仅适用于使用透视表的多对多用户。直接一对多是一对多的,需要以不同的方式定义(这只会引起有关您的设计的更多问题)