Laravel 5.6 Попытка получить свойство необъекта - PullRequest
0 голосов
/ 01 июля 2018

Когда я пытаюсь повторить значение, я получаю исключение. Я проверяю коллекцию с помощью dd () и она не равна нулю.

Мои модели:

Cliente:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Cliente extends Model
{
    protected $table = 'clientes';

    public function ordens() {
        return $this->hasMany('App\OrdemServico','cliente_id');
    }
}

OrdemServico:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class OrdemServico extends Model
{
    protected $table = 'ordens_servico';

    public function clientes() {
        return $this->belongsTo('App\Cliente','id');
    }
}

OrdemServicoController:

public function index()
{

    $ordens = OrdemServico::with('clientes')->get();

    return view('home',compact('ordens'));

}

Part View Home:

             <table class="table">
                    <thead>
                    <tr>
                        <th scope="col">#</th>
                        <th scope="col">Nome Cliente</th>
                        <th scope="col">Modelo</th>
                        <th scope="col">Status O.S</th>
                    </tr>
                    </thead>
                @foreach($ordens as $ordem)
                    <?php //dd($ordem->clientes->nome); ?>
                    <tr>
                        <th scope="row"></th>
                        <td>{{$ordem->id}}</td>
                        <td>{{$ordem->clientes->nome}}</td>
                        <td></td>
                        <td></td>
                        <td><button class="btn btn-outline-primary" onclick="location.href='{{ route('ordem_servico.show',1) }}'">Mostrar mais</button></td>
                    </tr>
                @endforeach

                    </tbody>
                </table>

Когда я

<?php dd($ordem->clientes->nome); ?>

Я получаю:

dd () возврат

Но когда я пытаюсь повторить значение, я получаю исполнение.

dd () $ ordem.

https://gist.github.com/vgoncalves13/8140a7a1bf2cb85fe4d16da20ea34acc

Ответы [ 4 ]

0 голосов
/ 02 июля 2018

Виктор, у которого есть проблемы с клиентами, у которых есть все шансы на успех, и то, что я делаю на вердаде и у тебя.

О правильных словах, таких как форма, exibida acima, como o @ Хуссейн Мостру, о том, что вы есть:

@php
  $clientes = $ordem->clientes
@enphp

<td>
    @forelse( $clientes as $cliente)
       {{ $cliente->nome }}
    @empty
      Nenhum cliente
    @endforelse
</td>

Enfim, voest está tentando acessar a proparade nome em uma lista de objetos, o correto seria você fazer do modo acima, ou então, dizer em qual Item da lista de objetos você deseja acessar a propridade nome, ex:

 <td>{{$ordem->clientes[indice]->nome}}</td>
0 голосов
/ 01 июля 2018

Возможно, ваши отношения должны называться cliente(), предполагая, что заказ принадлежит только одному App\Cliente ... и вы должны передать третий аргумент, который является other_key ... вы можете избежать этого типа ошибки, используя английский (поскольку laravel будет искать customer_id и order_id)

Попробуйте следующий код

App namespace;

использовать Illuminate \ Database \ Eloquent \ Model;

class Cliente extends Model
{
    protected $table = 'clientes';

    public function ordens() {
        return $this->hasMany('App\OrdemServico','cliente_id');
    }
}

и

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class OrdemServico extends Model
{
    protected $table = 'ordens_servico';

    public function cliente() {
        return $this->belongsTo('App\Cliente', 'id', 'cliente_id');
    }
}

Ссылка: https://laravel.com/docs/5.6/eloquent-relationships#one-to-many

0 голосов
/ 01 июля 2018

Ваш код идеален, одно из ваших clientes отношений может быть пустым, и у вас есть этот код в цикле, вызывая ошибку. Просто добавьте if проверка должна работать

<table class="table">
    <thead>
        <tr>
            <th scope="col">#</th>
            <th scope="col">Nome Cliente</th>
            <th scope="col">Modelo</th>
            <th scope="col">Status O.S</th>
        </tr>
    </thead>
        @foreach($ordens as $ordem)
            <?php //dd($ordem->clientes->nome); ?>
            <tr>
                <th scope="row"></th>
                <td>{{$ordem->id}}</td>
                <td>
                    @if ($ordem->clientes)
                        {{$ordem->clientes->nome}}
                    @else
                        'No Client'
                    @endif
                </td>
                <td></td>
                <td></td>
                <td><button class="btn btn-outline-primary" onclick="location.href='{{ route('ordem_servico.show',1) }}'">Mostrar mais</button></td>
            </tr>
        @endforeach
    </tbody>
</table>

Примечание: Всегда старайтесь использовать единственное имя для belongsTo отношения, потому что оно возвращает вам одну модель. Например, вы должны использовать cliente имя отношения вместо clientes.

0 голосов
/ 01 июля 2018

$ordem->clientes это массив, отображать их так

     @foreach($ordens as $ordem)
                <?php //dd($ordem->clientes->nome); ?>
        <tr>
            <th scope="row"></th>
            <td>{{$ordem->id}}</td>
            @foreach($ordem->clientes->toArray() as $client)
                <td>{{$client['nome']}}</td>
            @endforeach
            <td></td>
            <td></td>
            <td><button class="btn btn-outline-primary" onclick="location.href='{{ route('ordem_servico.show',1) }}'">Mostrar mais</button></td>
        </tr>
    @endforeach
...