У меня есть 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
tn_client
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, и что я сделал неправильно, что делает такую ошибку, как это?
Каков метод в контроллере, который возвращает это представление с проектами? Проверьте отношения проекта в модели клиента. Я думаю, что это должно быть hasMany, а не hasOne. Вы должны назвать его проектами. –
Я думаю, что клиентская модель не имеет к этому отношения, поскольку модель использует 'project.php', контроллер использует' ProjectController.php' и просматривает с помощью 'project.blade.php', я все еще не понимаю, как использовать отношения, и btw посмотрим на мой контроллер еще раз, я добавил код, возможно, это поможет –
Спасибо за обновление вопроса! Когда вы пытаетесь получить данные из отношения belongsTo, он возвращает null, если он не может найти связанный объект. Итак, проверьте, есть ли у вас какие-либо проекты без client_id. Если ваши бизнес-правила не позволяют проект без клиента, вы должны проверить данные перед созданием записи.Если в противном случае у вас может быть проект без client_id, вы должны сделать простую проверку в foreach: if ($ project-> client) {$ project-> client-> cv_name} –