Laravel:显示两个相关模型的信息

时间:2017-05-21 22:35:25

标签: php laravel laravel-5.4

我在项目中使用Laravel 5.4,我无法从相关模型中获取信息以便正确显示。该计划适用于宠物主人首次注册的小型兽医诊所,然后添加每只宠物(每个主人可以有许多)。反过来,每个宠物可以有多个咨询,疫苗接种,文件等。因为每个至少涉及三层,我尽管最好保持网址/路径尽可能简单,所以而不是宠物的url是/ owner / 1 / pet / 1,我把它保存为/ pet / 1,我相信这就是为什么我尝试的东西似乎都没有用(我见过的所有例子都遵循第一条路径)。< / p>

宠物控制器

我可以创建没有问题的新宠物,所有信息都会保存并可以编辑。问题是当我尝试查看它们时,有些看起来应该与各自的所有者信息相符,但其他人(最新的)给我一个错误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');
}

对于极长的帖子道歉,我只是很难弄清楚如何正确实现所有这些。在过去的几天里,我尝试了各种不同的方式,结果是部分工作结果或直接弄乱一切。谢谢你的帮助!

1 个答案:

答案 0 :(得分:0)

你可以按照这个步骤实现这一目标。

建立我们的模范关系..

宠物模型

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>

希望这真的有帮助..