あじちゃんの備忘録。

〜ここはメモ帳です

【解決】dump結果とview表示結果が異なる@Laravel 5.6

解決しました

参考リンク

解決方法

  • Modelに protected $casts = ['id' => 'string']; を追加したことで解決!!

解決までの道筋

  • dump結果とviewでの表示を見比べて、型がintegerになっているのではと推測
dump($items);
dump($items->last()->id);
echo $items->last()->id . '<br>';
return gettype($items->last()->id); // 型を返す

とかしてたら、「collectionで取得したものの型変換がおかしいんじゃない?」という気持ちになり検索

  • 検索ワードは「lalravel collection 型変換」
  • この記事を見つけてSUCCESS!!!

問題だったもの

  • モデルに定義したテーブルからとってきた値をビューに表示するだけなのに、表示結果がおかしい。
  • ModelクラスのtoStringを追うと、jsonEncodeするときに値がおかしくなっていることがわかるがそれが本当の原因かは不明。
+------------------+-------------+------+-----+---------+-------+
| Field            | Type        | Null | Key | Default | Extra |
+------------------+-------------+------+-----+---------+-------+
| id               | varchar(97) | NO   | PRI | NULL    |       |
+------------------+-------------+------+-----+---------+-------+
<?php

$query = ItemModel::query();
$items = $query
    ->orderBy('id', 'asc')
    ->get();

dump($items);
return view('test.index', ["items" => $items]);
<?php

@foreach($items as $item)
  <p>{{ $item->id }}</p>
@endforeach
<?php /* dump結果 */

"id" => "123--これはID--456"
// -> [123]が表示される
"id" => "test"
// -> [0]が表示される
"id" => "あいうえお"
// -> [0]が表示される
"id" => "3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333"
// -> [9223372036854775807]が表示される

gitの複数のブランチを一括で削除する

xargs コマンドを使います。

xargs コマンドとは?

xargs コマンドとは、Linux のコマンドの1つ。
あるコマンドの出力を xargs コマンドに送り込み、別のコマンドの引数として指定することができます。

消したくない branch を除いた全ての branch を削除するとき

git branch | grep -v 消したくないbranch名など | xargs git branch -D

これは、パイプ( | )でくくった部分のコマンドを実行した結果に対して、 xargs 以降のコマンドを適用するという意味になります。 実際に実行したコマンドは以下の画像。(👹<s>-vが抜けてるのであとで書き直す 書き直した)

f:id:azix:20180816174516j:plain

git branch に対するコマンドは自分で判断してね。

【JavaScript】配列の比較について

まとめ

JavaScriptで、配列の比較の際に==又は===演算子を用いると、その配列が参照しているメモリ上のアドレスが同じかどうかでtrue/falseを返す。
Object.is() も同様。

var list_1 = ["mike","saba","tora"];
var list_2 = ["mike","saba","tora"];

console.log(list_1 === list_2);
// -> false
console.log(Object.is(list_1, list_2));
// -> false

配列が全く同じであっても、比較の際に == === Object.is() を用いると false が返る。
これは、比較対象が中の値ではなくポインタのアドレスを見ているため。

じゃあどうやって比較する?

一番楽なのは、toString() してしまう。 もしくは(冗長になってしまうけど)配列を回して比較。

var list_1 = ["mike","saba","tora"];
var list_2 = ["mike","saba","tora"];

console.log(list_1.toString() === list_2.toString());
// -> true
console.log(Object.is(list_1.toString(), list_2.toString()));
// -> true

ただ、Object.is()=== のようにオブジェクトを比較したいときはまたちょっと複雑そう・・・。いつか調べる。

追記

ツイッタで質問があったので。
JavaScriptの配列型にはequalsメソッドが存在しません。

[1, 2] == [1, 2];
// -> false

[1, 2].equals([1, 2]);
// -> Uncaught TypeError: [1,2].equals is not a function