【问题标题】:Laravel Polymorphic Relationships - Return child with parentLaravel 多态关系 - 与父母一起返回孩子
【发布时间】:2020-12-11 02:24:35
【问题描述】:

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

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Team extends Model
{
    public function teamable()
    {
        return $this->morphTo();
    }
    
}
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Marketcenter extends Model
{
    public function teams()
    {
        return $this->morphMany('App\Team', 'teamable');
    }
}

我需要检索一个或任何 Marketcenter 的所有团队,以便列出所有团队及其所属的 Marketcenter。

因此,我执行以下代码并在查询中获得市场中心的团队集合:

$marketcenters = Marketcenter::where('id', $request->user()->marketcenter->id)->with('teams')->get();
    foreach($marketcenters as $marketcenter) {
        dd($marketcenter->teams);
    }

但是当我想用相应的市场中心检索每个团队时,我的问题就出现了:

$marketcenters = Marketcenter::where('id', $request->user()->marketcenter->id)->with('teams')->get();
    foreach($marketcenters as $marketcenter) {
        dd($marketcenter->teams->marketcenter->mc_name);
    }

此集合实例上不存在属性 [marketcenter]。

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

问候

【问题讨论】:

    标签: laravel laravel-5


    【解决方案1】:

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

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

    另外,来自Laravel docs

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

    // This gets the marketcenter
    $team->teamable
    

    【讨论】:

    • 感谢您的帮助。该建议适用于此代码重构:Controller $marketcenters = Marketcenter::where('id', $request-&gt;user()-&gt;marketcenter-&gt;id)-&gt;with('teams')-&gt;get();
    【解决方案2】:

    我的问题是为什么你想通过像 $marketcenter->teams->marketcenter->mc_name 这样的团队模型访问“marketcenter”,而不是你可以直接在 for 循环中使用 $marketcenter->mc_name 因为两者都会返回相同的结果对象。

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

    【讨论】:

    • 谢谢@Hamza,我需要让团队记录他们所属的团队名称和市场中心名称,这就是我尝试访问 $marketcenter->teams->marketcenter-> 的原因mc_name 在循环中
    • 但是你不能像 $marketcenter->teams 是一个集合,因为它有 morphMany,另外就是没有像 Team 模型上定义的 marketcenter 那样的关系,请发布整个团队和市场模型,如果可能
    • 这两个模型是Team和Marketcenter,多态关系,都在首发,没有额外的模型。感谢您的帮助。
    • 我知道,但是您的团队模型没有 marketcenter 关系,它具有 teamable 作为 morph,因此您必须先使用 teamable 而不是 marketcenter,然后才能使用 $marketcenter->teams,因为它是 morphMany跨度>
    • 谢谢@Hamza!我找到了解决方案,我将在其他答案下发布。
    猜你喜欢
    • 1970-01-01
    • 2015-11-14
    • 1970-01-01
    • 2016-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多