2016-02-20 2 views
0

У меня есть 2 таблицы tn_client и tn_project, проект которых имеет 1 клиент, в то время как клиент может иметь много проектов, а не отображать клиент id на моей таблице, я хочу отобразить его имя клиента, но когда я сделал это, он сказал, пытаясь получить свойство не-объекта.Отображаемое имя выбранной формы, а не идентификатор (ошибка: попытка получить свойство не-объекта) laravel 5

Trying to get property of non-object (View: C:\xampp\htdocs\PKL\netxcel-activityreport-11b90b878d39\resources\views\project.blade.php)

Выше полная ошибка, что я получаю, а ниже таблицы

tn_project

enter image description here

tn_client

enter image description here

CONTROLLER

public function index(){ 
    Log::info('Entering index'); 
    return view('project') 
    ->with('title','Project') 
    ->with('projects',Project::with('client','invoice')->get()) 
    ->with('clients',Client::all()) 
    ->with('invoices', Invoice::all()); 
} 

//get all data 
public function getAll(){ 
    return Response::json(
      array(
        'content' => Project::with('client','invoice')->get(), 
        'status' => 'success', 
       ) 
     ); 
} 
public function createOrEdit(){ 
    $currentUsername = Auth::user()->name; 

    $isUpdate = false; 
    $projectId = Input::get('prevId'); 

    //populate data 
    $project = new Project; 
    if($projectId != ""){ 
     $project = Project::where('cv_id','=',$projectId)->firstOrFail(); 
     $project->cv_updated_by = $currentUsername; 
     $project->cn_updated_at = Carbon::now(); 
     $isUpdate = true; 
    } else{ 
     $project->cv_created_by = $currentUsername; 
     $project->cn_created_at = Carbon::now(); 
    } 

    $project->cv_id = Input::get('projectId'); 
    $project->cv_name = Input::get('projectName'); 
    $project->cv_client_id = Input::get('clientId'); 
    $project->cn_invoice_method = Input::get('invoiceId'); 
    $project->cn_project_rate = Input::get('projectRate'); 
    $project->cn_note = Input::get('note'); 

    //execute 
    if($isUpdate){ 
     Log::info("entering update mode"); 
     Project::where('cv_id','=',$projectId)->update(['cv_id'=>$project->cv_id, 
        'cv_name'=>$project->cv_name, 
        'cv_client_id'=>$project->cv_client_id, 
        'cn_invoice_method'=>$project->cn_invoice_method, 
        'cn_project_rate'=>$project->cn_project_rate, 
        'cn_note'=>$project->cn_note, 
        'cn_updated_at'=>$project->cn_updated_at, 
        'cv_updated_by'=>$project->cv_updated_by]); 
    }else{ 
     $project->save(); 
    } 

    return Response::json(
      array(
        'content' => Project::with('client','invoice')->get(), 
        'status' => 'success', 
       ) 
     ); 
} 

Model

ПРОЕКТ

<?php 
namespace Activity; 

use Illuminate\Database\Eloquent\Model; 

class Project extends Model { 
    protected $table = 'tn_project'; 
    public $timestamps = false; 

    protected $fillable = [ 
     'cv_id', 
     'cv_name', 
     'cv_client_id', 
     'cn_invoice_method', 
     'cn_project_rate', 
     'cn_note', 
     'cn_created_at', 
     'cv_created_by', 
     'cn_updated_at', 
     'cv_updated_by' 
    ]; 

    public function client(){ 
     return $this->belongsTo('Activity\Client','cv_client_id','cn_id'); 
    } 

    public function invoice(){ 
     return $this->hasOne('Activity\Invoice','cn_id','cn_invoice_method'); 
    } 
} 

КЛИЕНТ

<?php 
namespace Activity; 

use Illuminate\Database\Eloquent\Model; 

class Client extends Model { 

    protected $table = 'tn_client'; 
    public $timestamps = false; 

    protected $fillable = [ 
     'cv_name', 
     'cv_contact', 
     'cv_email', 
     'cv_phone', 
     'cv_address', 
     'cn_created_at', 
     'cn_created_by', 
     'cn_updated_at', 
     'cn_updated_by' 
    ]; 

    public function project(){ 
     return $this->hasOne('Activity\Project', 'cv_id', 'cn_id'); 
    } 
} 

VIEW

это мой выбор формы

<div class="col-md-9"> 
    <select name="clientId" id="clientId" class="form-control" placeholder="Select Client"> 
     @foreach ($clients as $client) 
       <option value='{{$client->cn_id}}'>{{$client->cv_name}}</option>; 
     @endforeach  
    </select> 
</div> 

Это, как я назвал функцию, чтобы отобразить его на мой взгляд

@foreach($projects as $project) 
    <tr class="odd gradeX"> 
     <td>{{$project->cv_id}}</td> 
     <td>{{$project->cv_name}}</td> 
     <td>{{$project->client->cv_name}}</td><!--This is what cause an --> 
     <td>{{$project->cn_invoice_method}}</td> 
     <td>{{$project->cn_project_rate}}</td> 
     <td>{{$project->cn_note}}</td> 
     <td> 
      <a class="btn btn-success" title="edit" data-id={{$project->cv_id}} data-action="project-edit"><i class="fa fa-pencil"></i></a> 
      <a class="btn btn-danger" title="delete" data-id={{$project->cv_id}} data-action="project-delete"><i class="fa fa-times"></i></a> 
     </td> 
    </tr> 
@endforeach 

им еще новое для Laravel, и что я сделал неправильно, что делает такую ​​ошибку, как это?

+0

Каков метод в контроллере, который возвращает это представление с проектами? Проверьте отношения проекта в модели клиента. Я думаю, что это должно быть hasMany, а не hasOne. Вы должны назвать его проектами. –

+0

Я думаю, что клиентская модель не имеет к этому отношения, поскольку модель использует 'project.php', контроллер использует' ProjectController.php' и просматривает с помощью 'project.blade.php', я все еще не понимаю, как использовать отношения, и btw посмотрим на мой контроллер еще раз, я добавил код, возможно, это поможет –

+0

Спасибо за обновление вопроса! Когда вы пытаетесь получить данные из отношения belongsTo, он возвращает null, если он не может найти связанный объект. Итак, проверьте, есть ли у вас какие-либо проекты без client_id. Если ваши бизнес-правила не позволяют проект без клиента, вы должны проверить данные перед созданием записи.Если в противном случае у вас может быть проект без client_id, вы должны сделать простую проверку в foreach: if ($ project-> client) {$ project-> client-> cv_name} –

ответ

0

Я нашел ответ, я получил ссылку от here, поэтому, основываясь на этой ссылке и основной из x-> y-> z, мы должны сначала проверить, что x-> y имеет некоторое значение, если да, мы должны проверить, является ли это объект или просто массив, в моем случае это был массив так, а делать что-то вроде этого

{{$project->client->cv_name}} 

, который является то, что, как отобразить объект, мы должны сделать что-то вроде этого

{{$project->client['cv_name']}} 

и вот как вы решаете свою проблему, приветствия: D

Смежные вопросы