Laravel多态关系-返回子级和父级

Laravel多态关系-返回子级和父级,laravel,laravel-5,Laravel,Laravel 5,我有一个模型团队,与Marketcenters模型有多态关系: <?php namespace App; use Illuminate\Database\Eloquent\Model; class Team extends Model { public function teamable() { return $this->morphTo(); } } 但当我想检索每个团队及其相应的市场中心时,我的问题出现了: $market

我有一个模型团队,与Marketcenters模型有多态关系:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Team extends Model
{
    public function teamable()
    {
        return $this->morphTo();
    }
    
}
但当我想检索每个团队及其相应的市场中心时,我的问题出现了:

$marketcenters = Marketcenter::where('id', $request->user()->marketcenter->id)->with('teams')->get();
    foreach($marketcenters as $marketcenter) {
        dd($marketcenter->teams->marketcenter->mc_name);
    }
此集合实例上不存在属性[marketcenter]

如何在多形关系中将父数据检索到子记录


关于

我的问题是,为什么您希望通过团队模型访问“marketcenter”,例如$marketcenter->teams->marketcenter->mc_name,而您可以直接在for循环中使用$marketcenter->mc_name,因为两者都会返回相同的对象


如果您仍然需要它,那么您必须为martketcenter->team创建另一个foreach循环,因为您有morphMany,因此如果您想要市场,它将从团队模型返回集合对象,而不是调用teamable函数,该函数将返回变形模型的对象,该对象可能是Marketcenter,也可能不取决于变形模型附加到该记录的模型

尝试查询团队而不是市场中心:

$teams = Team::whereHas('teamable', function ($q) {
    $q->whereKey(request()->user()->marketcenter->id);
})->get();
此外,从:

您还可以通过访问执行morphTo调用的方法的名称,从多态模型中检索多态关系的所有者


谢谢@Hamza我需要有团队记录,记录团队名称和他们所属的市场中心名称,tjat,这就是为什么我试图在循环中访问$marketcenter->teams->marketcenter->mc_name,但你不能,因为$marketcenter->teams是一个集合,因为它有很多,另一件事是团队模型中没有定义像marketcenter这样的关系,请发布整个团队和marketplace模型,如果可能的话。这两个模型是具有多态关系的团队和marketcenter,两者都在第一篇文章中,它们之间的关系中没有附加的模型。谢谢你的帮助。我知道,但你的团队模型没有marketcenter关系,它具有可团队化的变形,因此你必须使用可团队化而不是marketcenter,在此之前,你必须使用$marketcenter->teams,因为它是morpmanyTanks@Hamza!我找到了解决方案,我将在其他答案下发布。谢谢你的帮助。该建议与此代码重构配合使用:Controller
$marketcenters=Marketcenter::where('id',$request->user()->Marketcenter->id)->with('teams')->get()
$marketcenters = Marketcenter::where('id', $request->user()->marketcenter->id)->with('teams')->get();
    foreach($marketcenters as $marketcenter) {
        dd($marketcenter->teams->marketcenter->mc_name);
    }
$teams = Team::whereHas('teamable', function ($q) {
    $q->whereKey(request()->user()->marketcenter->id);
})->get();
// This gets the marketcenter
$team->teamable