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();

Другие вопросы по тегам