Laravel eloquent кажется странным, показывая, что "[ключ] равен нулю, а [ключ] не равен нулю" в запросе SQL
Извините, я все еще новичок в Laravel/Lumen, и у меня проблема с отношениями за столом.
Это ошибка, которую я продолжаю получать.
"message": "SQLSTATE [42S22]: Столбец не найден: 1054 Неизвестный столбец 'clients.client_project_id' в 'предложении where' (SQL: select * from
clients
гдеclients
,client_project_id
является нулевым иclients
,client_project_id
не нуль)",
Если вы заметили, SQL-запрос содержит странное условие где, и я не знаю, где в коде проблема.
Мне нужен ваш опыт, чтобы решить эту проблему. Если вам нужна другая информация, пожалуйста, сообщите мне.
[Дополнительная информация]
МИГРАЦИОННЫЕ ФАЙЛЫ
class CreateClientProjectAssignmentTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('client_project', function (Blueprint $table) {
$table->increments('id');
$table->string('project_key', 50);
$table->integer('client_project_id')->unsigned();
$table->timestamps();
$table->foreign('client_project_id')
->references('id')
->on('clients')
->onDelete('cascade');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('client_project_assignment');
}
}
class CreateClientsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('clients', function (Blueprint $table) {
$table->increments('id');
$table->string('last_name', 50);
$table->string('first_name', 50);
$table->string('email_address', 50);
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop('clients');
}
}
Сеялки
class ClientProjectTableSeeder extends Seeder
{
/**
* @inheritdoc
*/
public function run()
{
$this->loadDefaultProjects();
}
/**
* Load default projects
*/
private function loadDefaultProjects()
{
$projects = [
[
'project_key' => 'PRJ',
'client_project_id' => 1
]
];
foreach ($projects as $project) {
$obj = new ClientProject;
$obj->fill($project);
$obj->save();
}
}
}
class ClientTableSeeder extends Seeder
{
/**
* @inheritdoc
*/
public function run()
{
$this->loadDefaultClients();
}
/**
* Load default clients
*/
private function loadDefaultClients()
{
$clients = [
[
'last_name' => 'First',
'first_name' => 'Client',
'email_address' => 'c.first@sample.com',
],
[
'last_name' => 'Second',
'first_name' => 'Client',
'email_address' => 'c.second@sample.com',
]
];
foreach ($clients as $client) {
$obj = new Client;
$obj->fill($client);
$obj->save();
}
}
}
МОДЕЛИ
class ClientProject extends AbstractCrudModel
{
/**
* @inheritdoc
*/
protected $table = 'client_project';
/**
* @inheritdoc
*/
protected $fillable = ['project_key', 'client_project_id'];
/**
* @inheritdoc
*/
protected $hidden = ['updated_at'];
/**
*
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
*/
public function clients()
{
return $this->hasMany(Client::class);
}
}
class Client extends AbstractCrudModel
{
/**
* @inheritdoc
*/
protected $table = 'clients';
/**
* @inheritdoc
*/
protected $hidden = ['updated_at'];
/**
*
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
*/
public function projects()
{
return $this->belongsToMany('App\Models\ClientProject');
}
}
СКЛАД
class ClientProjectRepository extends AbstractCrudRepository
{
public function __construct(ClientProject $model)
{
$this->setModel($model);
}
public function getClients($project)
{
$this->model()::find(1)->clients()->get();
}
}
Что я ожидаю:
Я должен быть в состоянии получить проект с идентификатором 1 и информацию о клиенте для этого конкретного проекта.
1 ответ
Вы пытаетесь получить клиентов, которые принадлежат ClientProject. Это отношение не настроено в вашей миграции. Laravel пытается найти клиентов с помощью client_project_id, который относится к идентификатору ClientProject. Вам нужно добавить эту миграцию в client_projects.
$table->integer('client_project_id')->unsigned();