#php #laravel
#php #laravel
Вопрос:
] Я начинающий разработчик php. У меня есть проект в Laravel 5.6.
У меня есть 2 миграции:
class CreateStopwatches extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('stopwatches', function (Blueprint $table) {
$table->increments('id');
$table->integer('case_id')->unsigned();
$table->foreign('case_id')->references('id')->on('case_instances')->onDelete('cascade');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('stopwatches');
}
}
class CreateStopwatchTimeCycles extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('stopwatch_time_cycles', function (Blueprint $table) {
$table->increments('id');
$table->morphs('timecycle');
$table->boolean('status')->default(0);
$table->integer('worked_time')->default(0);
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('stopwatch_time_cycles');
}
}
И модели:
class Stopwatch extends Model
{
protected $fillable = [
'case_id'
];
protected $casts = [
'id' => 'int',
'case_id' => 'int',
];
protected $dates = [
'created_at',
'updated_at'
];
public function timeCycle()
{
return $this->morphMany(StopWatchTimeCycle::class, 'timecycle');
}
}
class StopwatchTimeCycle extends Model
{
protected $fillable = [
'case_id'
];
protected $casts = [
'id' => 'int',
'case_id' => 'int',
];
protected $dates = [
'created_at',
'updated_at'
];
public function stopwatch()
{
return $this->morphTo();
}
}
В моем контроллере мне нужно вернуть 1 — когда у stopwatches есть stopwatches_time_cycles . Я создаю этот контроллер:
public function checkActivity(int $caseId)
{
if (Stopwatch::with(['timeCycle'])->where('case_id', $caseId)->withCount('timeCycle')->first() === 0) {
return 0;
} else {
return 1;
}
}
но это работает некорректно. Это всегда возвращает 1 (у меня есть пустая таблица stopwatch_time_cycles).
Как я могу это исправить?
Пожалуйста, помогите мне
Ответ №1:
Вы сравниваете весь ваш объект секундомера с нулем в вашем первом операторе if. Вот что вызывает ошибку здесь.
Вы должны сохранить секундомер в одной переменной:
$stopwatch = Stopwatch::with(['timeCycle'])->where('case_id', $caseId)->withCount('timeCycle')->first();
И затем, чтобы выполнить проверку, существуют ли временные циклы, вы можете просто сделать:
if($stopwatch->timeCycle->count() == 0){
...
} else {...}
Комментарии:
1. Я делаю это: $ stopwatch = Stopwatch::with([‘timeCycle’])->where(‘case_id’, $CaseID)->withCount(‘timeCycle’)->first(); если($ stopwatch-> timeCycle-> count() == 0){возвращает 0; } else { возвращает 1; } и теперь у меня всегда 0
2. мои записи: ibb.co/QDyZBDP и ibb.co/TYLTpwK
3. Можете ли вы попробовать удалить
with(['timeCycle'])
часть запроса? У вас есть этот метод в вашей модели, поэтому он должен быть автоматически присоединен, нет необходимости вызыватьwith
для него функцию.4. Я делаю: $ stopwatch = Stopwatch::where(‘case_id’, $CaseID)-> withCount(‘timeCycle’)->first(); — и это не помогает. У меня 0 в результате