【问题标题】:Laravel: showing information from two related modelsLaravel:显示来自两个相关模型的信息
【发布时间】:2017-10-21 11:56:19
【问题描述】:

我在一个项目中使用 Laravel 5.4,我无法从相关模型中获取信息以正确显示。该计划适用于一家小型兽医诊所,首先注册宠物主人,然后添加他们的每只宠物(每个主人可以有很多只)。反过来,每只宠物都可以有多次咨询、疫苗接种、文件等。因为每个宠物至少涉及三层,但我认为最好保持 url/路径尽可能简单,而不是宠物的url 为 /owner/1/pet/1,我将其保留为 /pet/1,我相信这就是为什么我尝试过的任何事情似乎都无法正常工作(我见过的所有示例都遵循第一条路径)。

宠物控制器

我可以毫无问题地创建新宠物,它们的所有信息都已保存并可编辑。问题是当我尝试查看它们中的每一个时,有些看起来都与它们各自的所有者信息一样,但其他(最新的)给我一个错误Trying to get property of non-object (View: D:\xampp\htdocs\veterinary\resources\views\pets\show.blade.php)

public function index()
{
    $pets = Pet::all();
    $owner = Owner::find($pets);  
    return view('pets.index', compact('owner', 'pets'));
}

public function store(Request $request)
{
    $pet= new Pet;
    //////////////
    $pet->save();
}

public function show(Pet $pet)
{
    $owner = Owner::find($pet);  
    return view('pets.show', compact('owner', 'pet'));
}

所有者控制者

我可以毫无问题地显示主人的信息,但我似乎无法检索到他们名下注册的宠物列表。我尝试了不同的方式并得到了不同的结果(没有错误但没有找到宠物,对象为空,查询无法转换为字符串等)。我用迄今为止我尝试过的注释方式留下了函数。

public function index()
{
    $owners = Owner::all();
    return view('owners.index', compact('owners'));
}

public function getPets($id)
{
    $pets = Pet::owner($id)->get();
    return $pets;
}

public function store(Request $request)
{
    $owner = new Owner;
    //////////////
    $owner->save();
}

public function show(Owner $owner)
{
    //$pets = Owner::pets();  
    //$owner = Owner::find($owner->id_owner);
    //$pets = $this->getPets($owner->owner_id);
    //$pets = Pet::find($owner)->owner()->where('id_owner', '=', $owner->id_owner)->get();

    $pets = DB::table('pets')->where('owner_id','=',$owner->id_owner);
    $pets = Pet::find($pets)->owners;
    return view('owners.show', compact('owner', 'pets'));
}

宠物模型

public function owner()
{
    return $this->belongsTo('App\Owner');
}

所有者模型

public function pets()
{
    return $this->hasMany('App\Pet');
}

抱歉,这篇文章太长了,我只是很难弄清楚如何正确地实现所有这些。在过去的几天里,我尝试了各种不同的方法,最终得到了部分有效的结果,或者直接把一切都搞砸了。感谢您的帮助!

【问题讨论】:

  • 这不是它的工作原理..
  • 宠物在保存时应与所有者相关联..
  • 或者如果这是多对多关系..然后使用belongsToMany
  • 我觉得不是多对多的关系,每个Owner可以有很多宠物(hasMany),但是每个宠物只能有一个主人。在宠物控制器的存储功能中,我之前确实尝试过使用$owner->pets()->save($pet);,但它没有通过,它只是显示一个错误并且不保存新宠物,这就是我重新使用$pet->save(); 的原因,但我确实认为这是无法访问最新保存的宠物的部分原因(仅以前的宠物)。我在这里做错了吗?
  • $owner = Owner::find(1); 然后 .. $pet = new Pet; blahblah , $pet->owner_id = $owner->id; $pet->save();

标签: php laravel laravel-5.4


【解决方案1】:

您只需按照以下步骤即可实现。

建立我们的模型关系..

宠物模型

public function owner()
{
    return $this->belongsTo('App\Owner');
}

所有者模型

public function pets()
{
    return $this->hasMany('App\Pet');
}

现在 .. 我们的所有者控制器

public function index()
{
    $owners = Owner::with('pets')->get();
    return view('owners.index', compact('owners'));
}


public function store(Request $request)
{
    $owner = new Owner;
    // $owner->blahblah = $request->blahblah;
    $owner->save();
}

public function show(Owner $owner)
{
    $owner->pets;
    return view('owners.show', compact('owner'));
}

owner.index 中您可以看到所有使用的所有者

<ul>
@foreach($owners as $owner)
    <li>{{ $owner->somefield }}
        <ul>
        @foreach($owner->pets as $pet)
            <li>{{ $pet->somefield }}</li>
        @endforeach
        </ul>
    </li>
@endforeach
</ul>

owner.show

<ul>
    <li>{{ $owner->somefield }}
        <ul>
        @foreach($owner->pets as $pet)
            <li>{{ $pet->somefield }}</li>
        @endforeach
        </ul>
    </li>
</ul>

这就是您使用所有者访问宠物的方式..

现在是我们的宠物控制器

public function index()
{
    $pets = Pet::with('owner')->get();
    return view('pets.index', compact('pets'));
}

public function store(Request $request)
{
    // there are several way to save this pet ..
    // 1

    $pet = new Pet;
    $pet->owner_id = $request->owner_id;
    // $pet->somefield = $request->somevalue;
    $pet->save();

    // 2
    $owner = Owner::find($request->owner_id);
    $owner->pet()->create(['somefield'=>$request->somevalue]);

    // 3
    $pet = new Pet;
    $pet->somefield = $request->somevalue;
    $owner = Owner::find($request->owner_id);
    $pet = $owner->pet()->save($pet);
}

public function show(Pet $pet)
{
    $pet->owner;
    return view('pets.show', compact('pet'));
}

对于pet views,它们与owner views 具有相同的逻辑..

pets.index

<ul>
@foreach($pets as $pet)
    <li>{{ $pet->somefield }}
        <ul>
            <li>{{ $pet->owner->somefield }}</li>
        </ul>
    </li>
@endforeach
</ul>

pets.show

<ul>
    <li>{{ $pet->somefield }}
        <ul>
            <li>{{ $pet->owner->somefield }}</li>
            <li>My Owner's other pets
            <ul>
            @foreach($pet->owner->pets()->where('id','!=',$pet->id)->get as $otherpet)
                <li>{{ $otherpet->somefieldlikepetname }}</li>
            @endforeach
            </ul>
            </li>
        </ul>
    </li>
</ul>

希望这真的有帮助..

【讨论】:

  • 非常感谢!这正是我所需要的,而且效果很好,我真的非常感谢你。主人现在正在展示他们所有的宠物,就像我需要的那样,事实证明我以前真的让宠物工作过,我完全忘记了我在数据库表中添加了一个新列,因为这里的新条目是空的,所以它一直给我我提到过几次的错误。让它成为我一天中的愚蠢时刻。再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-11
  • 2014-04-11
  • 2016-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多